JavaScript中的区域设置感知号码转换 [英] Locale aware number conversion in JavaScript

查看:132
本文介绍了JavaScript中的区域设置感知号码转换的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否有 JQuery插件 可以促进 NUMBER LOCALIZATION
也就是说,该插件应将数字转换为其本地字形。

 
阿拉伯语 | 4321 | 1234

印度语(泰卢固语/印地语) | 12345/12345 | 12345

PS:我的要求是数字CONVERSION,而不是格式化。

解决方案

你可以使用像这样的简单函数来翻译来自阿拉伯数字:

  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,//阿拉伯语零的字母代码
九= 57,//阿拉伯语的字母代码9
offset =(systems [target.toLowerCase()] || zero) - 零,
output = input.toString()。split(),
i,l = output.length,cc;

for(i = 0; i< l; i ++){
cc = output [i] .charCodeAt(0);
if(cc> = 0&& cc< = 9){
output [i] = String.fromCharCode(cc + offset);
}
}
返回output.join();
}

并称之为

  translateNumerals(12345,Telugu)//12345
translateNumerals(12345,Devanagari)//12345
translateNumerals( foo,梵文)//foo

转换为阿拉伯数字同样简单。它需要更多的管道。



上述函数知道任何目标系统中Zero的charCode,并做一些简单的数学运算,从阿拉伯数字到该系统进行逐字符转换。 / p>

反向函数需要检查输入的每个字符。如果它落在任何源系统的charCode 范围(即相应的零+9的charCode),它知道所需的偏移量。减去偏移量将使您进入阿拉伯语范围。这非常简单,我会留给你。






编辑#1:既然你提到了jQuery,就可以将上面的内容变成这样的插件:

  jQuery.fn.extend({
textTranslateNumerals:(function(){
var translateNumerals = function(input,target){
//上面的函数
};
返回函数(target){
//为每个选定的元素...
返回this.each(function(){
// ...查看每个子节点和
$(this).contents() .each(function(){
// ...翻译文本节点,递归到元素
if(this.nodeType === this.TEXT_NODE){
$(this).text (translateNumerals($(this).text(),target));
} else if(this.nodeType === this.ELEMENT_NODE){
$(this).textTransla teNumerals(目标);
}
});
});
};
})()
});






编辑#2: FWIW,这是一个可以从任何源系统转换为任何目标系统的函数:

  function translateNumerals(输入,来源,目标){
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,零= 0,九= 0,char = 0;

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

if(!(系统中的来源&&系统中的目标)
|| input == null
|| typeof input ==undefined|| typeof input ==object){
返回输入;
}

input = input.toString();
offset = systems [target] - systems [source];
zero = systems [source];
九=系统[来源] + 9;

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

if(char> = 0&& char< = 9){
output.push(String.fromCharCode(char + offset));
} else {
output.push(input [i]);
}
}
返回output.join();
}

样本输出

  translateNumerals(0123456789,arabic,malayalam)//0123456789
translateNumerals(0123456789,malayalam,arabic)// 0123456789
translateNumerals(0123456789,malayalam,kannada)//0123456789
translateNumerals(0123456789,kannada,nagari)//01২3456789
translateNumerals(0123456789,kannada,gujarati)//0123456789
translateNumerals(USD 13.56,arabic,nagari)//USD 13.56


Is there a JQuery Plugin available that facilitates NUMBER LOCALIZATION ? That is , the plugin should translate numerals into their local glyphs.

Arabic               |     ٤٣٢١      |   1234

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

PS : My requirement is number CONVERSION , not formatting .

解决方案

You could use a simple function like this one for the translation from Arabic numerals:

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("");
}

And call it like this

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

The translation to Arabic numerals is equally simple. It requires just a little more plumbing.

The above function knows the charCode of the Zero in any target system and does some simple math to do a character-by-character conversion from Arabic numerals to that system.

A reverse function would need to check each character of the input. If it falls the charCode range of any source system (i.e. the charCode of the respective Zero + 9) it knows the required offset. Subtracting the offset will get you into the Arabic range. This is pretty trivial and I'll leave it to you.


EDIT #1: Since you mentioned jQuery, the above could be made into a plugin like this:

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, here is a function that can convert from any source system into any target system:

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("");
}

Sample outputs

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

这篇关于JavaScript中的区域设置感知号码转换的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆