Конвертация числа с учетом локали в JavaScript - PullRequest
8 голосов
/ 11 ноября 2011

Имеется ли плагин JQuery , который облегчает НОМЕР ЛОКАЛИЗАЦИИ ?То есть плагин должен переводить цифры в их локальные глифы.

<b>Arabic</b>               |     ٤٣٢١      |   1234

<b>Indic (Telugu/Hindi)</b> |  ౧౨౩౪౫/१२३४५   |  12345

PS: Мое требование - число CONVERSION, а не форматирование.

Ответы [ 2 ]

16 голосов
/ 18 ноября 2011

Вы можете использовать простую функцию, подобную этой, для перевода из арабских цифр:

function translateNumerals(input, target) {
    var systems = {
            devanagari: 2406, tamil: 3046, kannada:  3302, 
            telugu: 3174, marathi: 2406, malayalam: 3430, 
            oriya: 2918, gurmukhi: 2662, nagari: 2534, gujarati: 2790
        },
        zero = 48, // char code for Arabic zero
        nine = 57, // char code for Arabic nine
        offset = (systems[target.toLowerCase()] || zero) - zero,
        output = input.toString().split(""),
        i, l = output.length, cc;

    for (i = 0; i < l; i++) {
        cc = output[i].charCodeAt(0);
        if (cc >= zero && cc <= nine) {
            output[i] = String.fromCharCode(cc + offset);
        }
    }
    return output.join("");
}

И назовите это так

translateNumerals(12345, "Telugu")      // "౧౨౩౪౫"
translateNumerals(12345, "Devanagari")  // "१२३४५"
translateNumerals("foo", "Devanagari")  // "foo"

Перевод на арабских цифр одинаково прост. Требуется чуть больше сантехники.

Вышеприведенная функция знает charCode of Zero в любой целевой системе и выполняет простую математическую процедуру для преобразования буквенных символов в арабские цифры в этой системе.

Функция реверса должна проверять каждый символ ввода. Если он падает в диапазоне charCode любой исходной системы (то есть в charCode соответствующего нуля + 9), он знает требуемое смещение. Вычитая смещение, вы попадете в арабский диапазон. Это довольно тривиально, и я оставлю это вам.


РЕДАКТИРОВАТЬ # 1: Поскольку вы упомянули jQuery, вышеперечисленное можно превратить в плагин, подобный этому:

jQuery.fn.extend({
    textTranslateNumerals: (function () {
        var translateNumerals = function (input, target) {
            // the above function
        };
        return function (target) {
            // for each selected element...
            return this.each(function () {
                // ...look at each child node and
                $(this).contents().each(function () {
                    // ...translate text nodes, recurse into elements
                    if (this.nodeType === this.TEXT_NODE) {
                        $(this).text(translateNumerals($(this).text(), target));
                    } else if (this.nodeType === this.ELEMENT_NODE) {
                        $(this).textTranslateNumerals(target);
                    }
                });
            });
        };
    })()
});

EDIT # 2: FWIW, вот функция, которая может конвертировать из любой исходную систему в любую целевую систему:

function translateNumerals(input, source, target) {
  var systems = {
    arabic:       48,
    devanagari: 2406, tamil: 3046, kannada:  3302, telugu: 3174, marathi:  2406,
    malayalam:  3430, oriya: 2918, gurmukhi: 2662, nagari: 2534, gujarati: 2790,
  },
  output = [], offset = 0, zero = 0, nine = 0, char = 0;

  source = source.toLowerCase();
  target = target.toLowerCase();

  if ( !(source in systems && target in systems) 
       || input == null 
       || typeof input == "undefined" || typeof input == "object" ) {
    return input;
  }

  input  = input.toString();
  offset = systems[target] - systems[source];
  zero   = systems[source];
  nine   = systems[source] + 9;

  for (var i=0, l=input.length; i<l; i++) {
    var char = input.charCodeAt(i);

    if (char >= zero && char <= nine) {
      output.push( String.fromCharCode(char + offset) );
    } else {
      output.push( input[i] );
    }
  }
  return output.join("");
}

Пример выходных данных

translateNumerals("0123456789", "arabic", "malayalam")  // "൦൧൨൩൪൫൬൭൮൯"
translateNumerals("൦൧൨൩൪൫൬൭൮൯", "malayalam", "arabic")  // "0123456789"
translateNumerals("൦൧൨൩൪൫൬൭൮൯", "malayalam", "kannada") // "೦೧೨೩೪೫೬೭೮೯"
translateNumerals("೦೧೨೩೪೫೬೭೮೯", "kannada", "nagari") // "০১২৩৪৫৬৭৮৯"
translateNumerals("೦೧೨೩೪೫೬೭೮೯", "kannada", "gujarati") // "૦૧૨૩૪૫૬૭૮૯"
translateNumerals("USD 13.56", "arabic", "nagari") // "USD ১৩.৫৬"
0 голосов
/ 13 ноября 2011

Я думаю, что вам лучше всего выбрать плагин jQuery Globalize: https://github.com/jquery/globalize

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...