如何根据语言环境将字符串转换为数字(与 .toLocaleString 相反)?

IT技术 javascript
2021-02-08 21:22:20

如果我做:

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

我会३,५००用印地语。

但是我怎样才能将它转换回3500. 我想要这样的东西:

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

所以,它可以给3500.

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

6个回答

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

https://github.com/jquery/globalize

上面的链接将带你到 git 项目页面。这是微软贡献的js库。您应该尝试一下并尝试使用该插件的 formt 方法。如果你想研究这个插件,这里是相同的链接:

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

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

全球化很棒,是实现这一目标的最佳方式。在此处查看示例用法
2021-03-20 21:22:20

不幸的是,您将不得不手动处理本地化。受到这个答案的启发,我创建了一个函数来手动替换印地语数字:

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/

非常感谢。但是我的情况是我必须用英语转换任何语言的数字,因为我的应用程序必须支持所有可能的文化。
2021-03-30 21:22:20
对于非拉丁字符的语言,您将不得不一次做一个。我参与过许多本地化项目,但不幸的是,没有“通用翻译器”这样的东西。
2021-04-08 21:22:20

使用全球化库

安装它

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

你可以试试这个

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('१२३४५६७८९', '印地语', '英语');

我从这里得到它 如果你需要一个 jquery 的东西,那么请试试这个链接

我认为这不能处理各种依赖于语言环境的方法来执行数千或十万/千万分隔符,这在toLocaleString结果中比不同的数字字符更常见
2021-04-06 21:22:20

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

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

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

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