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

问题描述 投票:0回答:8

如果我这样做:

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

我会得到印地语的

३,५००

但是我怎样才能将其转换回

3500
。 我想要这样的东西:

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

所以,它可以给

3500

可以通过javascript或jquery实现吗?

javascript parsing number-formatting
8个回答
6
投票

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

https://github.com/jquery/globalize

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

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

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


4
投票

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

我受到了 NG Prime InputNumber 组件中实现的解决方案的启发。他们使用

Intl.NumberFormat.prototype.format()
(我推荐)将值格式化为区域设置字符串,然后基于简单示例创建一组
RegExp
表达式,以便他们可以从格式化字符串中截取特定表达式。

可以使用

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

为什么Ng Prime没有走这条路?我想是因为

Intl.Numberformat.prototype.formatToParts()
不支持IE11,或者是还有什么我没注意到的原因。

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


2
投票

使用全球化库

安装

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


1
投票

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

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/


0
投票

你可以试试这个

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 的东西,请尝试此链接


0
投票

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

在这种情况下,javascript 首先具有数字,但在格式化显示时会丢失它。解析的一个简单解决方法是将实际浮点值与格式化值一起存储:

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

然后通过解析data属性取回来:

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

这是哥伦布蛋式答案。只要问题是鸡蛋,它就有效。


0
投票

我编写了一个实用程序函数,它使用 Intl.NumberFormat 来获取给定区域设置的千位和小数分隔符。然后它会对输入字符串进行标准化,将其转换为数值。

限制: 它会跳过对使用非 ASCII 数字系统(如印地语或阿拉伯数字)的语言环境的解析,因为该逻辑仅处理标准数字 (0-9)。我认为我们可以创建一种方法,可以将非 ASCII 数字映射到 ASCII 并用它完成解析。

/**
 * Extracts a number from a locale-specific string.
 * Skips locales with non-ASCII numerals.
 * 
 * @param {string} localeString - The input number string in a locale-specific format.
 * @param {string} locale - The locale to parse the string with (default: browser's locale).
 * @returns {number|null} - The parsed number, or null if parsing fails.
 */
function parseLocaleNumber(localeString, locale = getUserLocale()) {
  if (!localeString) return null;

  // Check if the string contains any ASCII digit
  const containsAsciiDigit = /\d/.test(localeString);
  if (!containsAsciiDigit) {
    return null; // Skip strings with non-ASCII numerals
  }

  // Handle negative numbers
  const isNegative = localeString.trim().startsWith("-");
  localeString = localeString.replace(/^-/, ""); // Remove hyphen for processing

  // Detect separators using Intl.NumberFormat
  const exampleNumber = 12345.6;
  const formatter = new Intl.NumberFormat(locale);
  const formattedExample = formatter.format(exampleNumber);

  // Extract thousands and decimal separators
  const nonNumericChars = formattedExample.match(/[^0-9]/g);
  const decimalSeparator = nonNumericChars ? nonNumericChars[nonNumericChars.length - 1] : null;
  const thousandsSeparator = nonNumericChars ? nonNumericChars[0] : null;

  if (!decimalSeparator || !thousandsSeparator) {
    return null; // Parsing failed
  }

  // Normalize the input string
  const normalizedValue = localeString
    .split(thousandsSeparator).join("") // Remove thousands separators
    .replace(new RegExp(`[^0-9${decimalSeparator}]`, "g"), "") // Remove non-numeric characters
    .split(decimalSeparator).join("."); // Replace decimal separator with "."

  const parsedValue = parseFloat(normalizedValue);
  return isNegative ? -parsedValue : parsedValue;
}

/**
 * Fetch the user's locale from the browser.
 * Fallback to 'en-US' if not available.
 */
function getUserLocale() {
  return (navigator.languages && navigator.languages[0]) || navigator.language || "en-US";
}

// Example usage:
console.log(parseLocaleNumber("1.234,56", "de-DE")); // Outputs: 1234.56
console.log(parseLocaleNumber("1,234.56", "en-US")); // Outputs: 1234.56
console.log(parseLocaleNumber("१२,३४५.६७", "hi-IN")); // Outputs: null (non-ASCII numerals)


-1
投票
var number = 3500;

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

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

var converted = parseInt(formatted)
© www.soinside.com 2019 - 2024. All rights reserved.