如何根据区域设置将字符串转换为数字(与.toLocaleString相反)

How do I convert String to Number according to locale (opposite of .toLocaleString)?

本文关键字:数字 toLocaleString 相反 转换 何根 区域 设置 字符串      更新时间:2023-09-26

如果我这样做:

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

我将获得印地语的३,५००

但是如何将其转换回3500。我想要一些类似的东西:

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

因此,它可以给出3500

可以通过javascript或jquery实现吗?

我想你正在寻找这样的东西:

https://github.com/jquery/globalize

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

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

我希望这就是你想要的,并将很快解决你的问题。如果不起作用,请告诉我。

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

NG Prime InputNumber组件中实现的解决方案给了我灵感。他们使用Intl.NumberFormat.prototype.format()(我建议使用)将值格式化为区域设置字符串,然后基于简单示例创建一组RegExp表达式,这样他们就可以从格式化的字符串中剪切出特定的表达式。

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

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

使用此解决方案的完整代码示例可以在此处找到。

不幸的是,您将不得不手动处理本地化问题。受这个答案的启发,我创建了一个功能,可以手动替换印地语数字:

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("३५००"));

Fiddle here:http://jsfiddle.net/yyxgxav4/

使用Globalize库。

安装

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的东西,那么请尝试这个链接

var number = 3500;
var toLocaleString = number.toLocaleString("hi-IN")
var formatted = toLocaleString.replace(',','')
var converted = parseInt(formatted)

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

在这种情况下,javascript将数字放在第一位,并在格式化显示时将其丢失。解析的一个简单解决方法是将实际浮点值与格式化值一起存储:

var number = 3500;
div.innerHTML = number.toLocaleString("hi-IN");
div.dataset.value = number;

然后通过解析数据属性将其取回:

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

这是哥伦布的蛋式回答。只要问题是一个鸡蛋,它就会起作用。