8

次のように、ユーザーのローカライズされた形式で小数を表示するWebページがあります。

  • 英語:7.75
  • オランダの:7,75

自分のマシンのJavaScriptで2つの数値変数を一緒に追加すると(数値は上記の形式の文字列から取得されます)、次の結果が得られます。

  • 英語:7.75 + 7.75 = 15.5
  • オランダの:7,75 + 7,75 = 0

このコードをオランダ語のユーザーのマシンで実行する場合、英語形式の加算が返さ0れ、オランダ語形式の加算が返されることを期待する必要があり15,5ますか?

つまり、JavaScriptの計算では、文字列から数値への変換にローカル小数点を使用しますか?

4

7 に答える 7

21

ロケール対応の数値パーサーの例を次に示します。

function parseLocaleNumber(stringNumber, locale) {
    var thousandSeparator = Intl.NumberFormat(locale).format(11111).replace(/\p{Number}/gu, '');
    var decimalSeparator = Intl.NumberFormat(locale).format(1.1).replace(/\p{Number}/gu, '');

    return parseFloat(stringNumber
        .replace(new RegExp('\\' + thousandSeparator, 'g'), '')
        .replace(new RegExp('\\' + decimalSeparator), '.')
    );
}

渡されたロケール(またはロケールパラメータが定義されていない場合はブラウザの現在のロケール)を使用して、千と小数点の区切り文字を置き換えます。

ドイツ語のロケール設定

var n = parseLocaleNumber('1.000.045,22');

nに等しくなり1000045.22ます。

アップデート:

  • \p{Number}数字を削除するための正規表現クラスを使用して、Pointyのコメントに対処しました。そのため、非アラビア数字でも機能します。
  • 数字が4桁ごとに区切られている言語をサポートするためのOrionAdrianのコメントに対処しました。
  • 解析のために異なるロケールを分離するためのロケールパラメータが追加されました。
于 2017-02-13T21:22:28.230 に答える
10

いいえ、区切り文字は常にjavascriptのドット(。)Numberです。したがって、は左から右への評価を呼び出すため、に7,75評価されます(コンソールで試してみてください: 、またはそれ以上のポイントまで)。オランダ語(オランダ語だけでなく、たとえばヨーロッパ大陸)形式の値を変換する場合は、。にする必要があります。プロトタイプの拡張機能を次のように書くことができます。75,x=1,x+=1,alert(x)var x=(7,75); alert(x);StringString

String.prototype.toFloat = function(){
      return parseFloat(this.replace(/,(\d+)$/,'.$1'));
};
//usage
'7,75'.toFloat()+'7,75'.toFloat(); //=> 15.5

ブラウザがサポートしている場合は、Number.toLocaleString

console.log((3.32).toLocaleString("nl-NL"));
console.log((3.32).toLocaleString("en-UK"));
.as-console-wrapper { top: 0; max-height: 100% !important; }

于 2012-08-17T11:26:28.780 に答える
5

@naitsirchのソリューションを拡張すると、Intl.NumberFormat.formatToParts()を使用して、JSにグループと小数点を解析させることができます。

function parseLocaleNumber(stringNumber) {
  let num = 123456.789,
    fmt_local = new Intl.NumberFormat(),
    parts_local = fmt_local.formatToParts(num),
    group = '',
    decimal = '';

  parts_local.forEach(function(i) {
    switch (i.type) {
      case 'group':
        group = i.value;
        break;
      case 'decimal':
        decimal = i.value;
        break;
      default:
        break;
    }
  });

  return parseFloat(stringNumber
    .replace(new RegExp('\\' + group, 'g'), '')
    .replace(new RegExp('\\' + decimal), '.')
  );
}

//replace this string with a number formatted for your locale
console.log(parseLocaleNumber("987,654,321.01"));
//output for "en" locale: 987654321.01

于 2019-05-29T22:42:28.353 に答える
3

@OXiGENからのソリューションを拡張すると、Intl.NumberFormat.formatToParts()を使用して、通貨記号も抽出できます:)

function parseLocaleNumber(stringNumber, locale, currency_code) {
  let num = 123456.789,
    fmt_local = new Intl.NumberFormat(locale, {
      style: 'currency',
      currency: currency_code
    }),
    parts_local = fmt_local.formatToParts(num),
    group = '',
    decimal = '',
    currency = '';

  // separators
  parts_local.forEach(function(i) {
    //console.log(i.type + ':' + i.value);
    switch (i.type) {
      case 'group':
        group = i.value;
        break;
      case 'decimal':
        decimal = i.value;
        break;
      case 'currency':
        currency = i.value;
        break;
      default:
        break;
    }
  });

  return parseFloat(stringNumber
    .replace(new RegExp('\\' + group, 'g'), '')
    .replace(new RegExp('\\' + decimal), '.')
    .replace(new RegExp('\\' + currency, 'g'), '')
  );
}

//replace inputs with a number formatted for your locale, your locale code, your currency code
console.log(parseLocaleNumber('$987,654,321.01', 'en', 'USD'));
//output for "en" locale and "USD" code: 987654321.01

于 2020-01-07T21:52:01.840 に答える
2

いいえ、コンマ(,)は、ドット()と同様に、特別な意味を持つ演算子.です。それ以外の場合は、次のように簡単です。

var array1 = [1,2];
var array2 = [1.2];

異なるロケールでは壊れます。私が知っているすべての主流言語は、ロケールに関係なく、個別に厳密に.扱います。,

于 2012-08-17T11:27:14.637 に答える
1

いいえ、小数点はJavaScriptでまったくローカライズされていません。また、parseFloat()は、JavaScriptソースコードで使用する必要があるのと同じ形式で数値を解析します:「。」小数点記号として、グループ(千)区切り文字なし、「E」または「e」を「10の累乗」記号として、ASCIIハイフン「-」をマイナス記号として使用します。

ローカライズされた形式で数値を読み書きするには、何か他のものが必要です。小数点の単一の問題と限られた数の言語に制限できない限り、Globalize.jsライブラリをお勧めします。その場合は、「。」をマップする文字列操作を行う方が簡単な場合があります。出力では「、」に、入力ではその逆になります。

于 2012-08-17T11:54:23.930 に答える
0

シンボルを考慮に入れると、これはすべての場合に機能します。

parseLocaleNumber: function ( stringNumber ) 
{
    let thousandSeparator = (11111).toLocaleString().replace(/1/g, '');
    let decimalSeparator = (1.1).toLocaleString().replace(/1/g, '');
    let symbol = (0).toLocaleString()
        .replace(/0/g, '')
        .replace(new RegExp('\\' + decimalSeparator), '.')
        .trim();

    return parseFloat(
        stringNumber
            .replace(new RegExp('\\' + thousandSeparator, 'g'), '')
            .replace(new RegExp('\\' + decimalSeparator), '.')
            .replace(new RegExp( symbol ), '')
    );
}

ハイライトされた2つの詳細:

  1. 最初の区切り文字はデフォルトで常に千の区切り文字を表示するため、1111の代わりに11111を使用してください。
  2. 数値形式は常に「。」を使用します 小数点記号として
于 2019-09-27T23:44:42.537 に答える