如何根据区域设置(与.toLocaleString相反)将String转换为Number?

时间:2014-09-03 13:05:54

标签: javascript

如果我这样做:

var number = 3500;
alert(number.toLocaleString("hi-IN"));

我会用印地语获得३,५००

但是如何将其转换回3500。 我想要这样的东西:

var str='३,५००';
alert(str.toLocaleNumber("en-US"));

所以,它可以提供3500

是否可以通过javascript,jquery或任何其他免费库?

7 个答案:

答案 0 :(得分:5)

我认为你正在寻找类似的东西:

https://github.com/jquery/globalize

以上链接将带您进入git项目页面。这是由Microsoft提供的js库。 你应该尝试一下,尝试使用该插件的formt方法。如果你想学习这个插件,这里有相同的链接:

http://weblogs.asp.net/scottgu/jquery-globalization-plugin-from-microsoft

我希望这是您正在寻找的,并将尽快解决您的问题。如果它不起作用,请告诉我。

答案 1 :(得分:1)

不幸的是,您必须手动处理本地化。受this answer的启发,我创建了一个手动替换印地语数字的函数:

function parseHindi(str) {
    return Number(str.replace(/[०१२३४५६७८९]/g, function (d) {
        return d.charCodeAt(0) - 2406;
    }).replace(/[०१२३४५६७८९]/g, function (d) {
        return d.charCodeAt(0) - 2415;
    }));
}

alert(parseHindi("३५००"));

在这里小提琴:http://jsfiddle.net/yyxgxav4/

答案 2 :(得分:1)

你可以尝试一下

function ConvertDigits(input, source, target) {
var systems = {
    arabic: 48, english: 48, tamil: 3046, kannada: 3302, telugu: 3174, hindi: 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 ; i < input.length; 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("");

}

  

var res = ConvertDigits('12345678 9','hindi','english');

我是从here得到的 如果您需要jquery,请try this link

答案 3 :(得分:1)

使用Globalize library

安装

npm install globalize cldr-data --save

然后

var cldr = require("cldr-data");
var Globalize = require("globalize");

Globalize.load(cldr("supplemental/likelySubtags"));
Globalize.load(cldr("supplemental/numberingSystems"));
Globalize.load(cldr("supplemental/currencyData"));

//replace 'hi' with appropriate language tag
Globalize.load(cldr("main/hi/numbers"));
Globalize.load(cldr("main/hi/currencies"));

//You may replace the above locale-specific loads with the following line,
// which will load every type of CLDR language data for every available locale
// and may consume several hundred megs of memory!
//Use with caution.
//Globalize.load(cldr.all());

//Set the locale
//We use the extention u-nu-native to indicate that Devanagari and
// not Latin numerals should be used.
// '-u' means extension
// '-nu' means number
// '-native' means use native script
//Without -u-nu-native this example will not work
//See 
// https://en.wikipedia.org/wiki/IETF_language_tag#Extension_U_.28Unicode_Locale.29
// for more details on the U language code extension 
var hindiGlobalizer = Globalize('hi-IN-u-nu-native');

var parseHindiNumber = hindiGlobalizer.numberParser();
var formatHindiNumber = hindiGlobalizer.numberFormatter();
var formatRupeeCurrency = hindiGlobalizer.currencyFormatter("INR");

console.log(parseHindiNumber('३,५००')); //3500
console.log(formatHindiNumber(3500));   //३,५००
console.log(formatRupeeCurrency(3500)); //₹३,५००.००

https://github.com/codebling/globalize-example

答案 4 :(得分:0)

var number = 3500;

var toLocaleString = number.toLocaleString("hi-IN")

var formatted = toLocaleString.replace(',','')

var converted = parseInt(formatted)

答案 5 :(得分:0)

最近,我一直在同一个问题,即将在任何语言环境中格式化的字符串化的数字转换回数字。

我从NG Prime InputNumber组件中实现的解决方案中得到了启发。他们使用Intl.NumberFormat.prototype.format()(我建议)将值格式化为语言环境字符串,然后根据简单的样本创建RegExp表达式集,以便可以从格式化的字符串中截断特定的表达式。

可以使用Intl.Numberformat.prototype.formatToParts()简化此解决方案。此方法返回有关grouping/decimal/currency以及用于格式化特定语言环境中的值的所有其他分隔符的信息,因此您可以轻松地从以前格式化的字符串中清除它们。这似乎是最简单的解决方案,它可以覆盖所有情况,但是您必须知道以前在哪种语言环境中格式化过该值。

为什么Ng Prime没有这样走?我认为是因为Intl.Numberformat.prototype.formatToParts()不支持IE11,或者还有其他我没有注意到的事情。

答案 6 :(得分:0)

此问题的常见情况是向用户显示一个浮点数,然后将其作为数值返回。

在这种情况下,javascript将数字放在首位,并且在格式化显示时将其散开。一种简单的解析方法是将实际的float值与格式化的值一起存储:

var number = parseFloat(div.dataset.value);

然后通过解析data属性将其恢复:

function propToString<T>(obj?: T): T {
  return new Proxy({}, {
    get({}, prop) {
      return prop;
    }
  }) as T;
}

class Foo {
  bar: string;
  fooBar: string;
}

console.log(propToString<Foo>().bar, propToString(new Foo()).fooBar);
// Prints: bar fooBar

// Cache the values for improved performance:
const Foo_bar = propToString<Foo>().bar;

这是哥伦布的蛋式答案。只要问题是鸡蛋,它就可以工作。