Javascript千区切り/文字列形式[重複]


96

数字と文字列をフォーマットするためのJavaScriptの関数はありますか?

私は文字列または数字の千の区切り記号の方法を探しています...(c#のString.Formatのように)



私はあなたがそこに必要なものを見つけると思います:) stackoverflow.com/questions/610406/...
JADファイル

How to print a number with commas as thousands separators in JavaScriptstackoverflow.com/questions/2901102/...
エイドリアンはして

回答:


160

アップデート(7年後)

以下の元の回答で引用されている参照は間違っていました。これに組み込み関数がありkaiserが以下で提案するとおりです。toLocaleString

だからあなたはできる:

(1234567.89).toLocaleString('en')              // for numeric input
parseFloat("1234567.89").toLocaleString('en')  // for string input

以下に実装されている関数も機能しますが、必要はありません。

(おそらく私は幸運になると思い、2010年必要であることわかりましたが、そうでありませんでした。このより信頼できるリファレンスによると、toLocaleStringはECMAScript 3rd Edition [1999]以降の標準の一部でした。 IE 5.5までサポートされていました。)


元の回答

このリファレンスによると、数値にカンマを追加するための組み込み関数はありません。しかし、そのページには、自分でコーディングする方法の例が含まれています。

function addCommas(nStr) {
    nStr += '';
    var x = nStr.split('.');
    var x1 = x[0];
    var x2 = x.length > 1 ? '.' + x[1] : '';
    var rgx = /(\d+)(\d{3})/;
    while (rgx.test(x1)) {
            x1 = x1.replace(rgx, '$1' + ',' + '$2');
    }
    return x1 + x2;
}

編集: 他の方法(コンマを含む文字列を数値に変換)にするには、次のようにします。

parseFloat("1,234,567.89".replace(/,/g,''))

本当に本当に感謝します//しかし、どうすればその文字列を(コンマで)数値に変換できますか?
LostLord 2010

この関数は、100,000を超える数値でブレークします
DevZer0

1
DevZer0 @いいえ、それはない
トールボーイ

純粋なjavascript +単一の正規表現置換で動作します stackoverflow.com/a/44324879/681830
Val

4
(1234567).toLocaleString().replace(/,/g," ",)数千の間のスペースに使用
ファンキー

122

が桁区切り記号、区切り記号、および小数点記号のローカライズについてである場合は、次のようにします。

// --> numObj.toLocaleString( [locales [, options] ] )
parseInt( number ).toLocaleString();

使用できるオプションがいくつかあります(フォールバックのあるロケールでさえも):

number = 123456.7089;

result  = parseInt( number ).toLocaleString() + "<br>";
result += number.toLocaleString( 'de-DE' ) + "<br>";
result += number.toLocaleString( 'ar-EG' ) + "<br>";
result += number.toLocaleString( 'ja-JP', { 
  style           : 'currency',
  currency        : 'JPY',
  currencyDisplay : 'symbol',
  useGrouping     : true
} ) + "<br>";
result += number.toLocaleString( [ 'jav', 'en' ], { 
  localeMatcher            : 'lookup',
  style                    : 'decimal',
  minimumIntegerDigits     : 2,
  minimumFractionDigits    : 2,
  maximumFractionDigits    : 3,
  minimumSignificantDigits : 2,
  maximumSignificantDigits : 3
} ) + "<br>";

var el = document.getElementById( 'result' );
el.innerHTML = result;
<div id="result"></div>

上の詳細MDNの情報ページ

編集: Commentor セレナのような@Iは、以下を追加します。

英語フォーマットが必要な英語以外のロケールのブラウザをサポートするには、を使用しますvalue.toLocaleString('en')。浮動小数点でも機能します。


これは浮動小数点数をカバーしていません。parseIntをparseFloatに変更できますが、yourInt = "100,12"(小数点区切りのカンマ)の場合、これは失敗します。これはreplace( "、"、 "。")..で修正できますが、 "1.000,12"で再び失敗します。だから...時々、車輪を再発明しなければならない。stackoverflow.com/a/2901298/1028304
ネイカー14

うまくいきません。カンマを使用しますが、ロケールでは3桁ごとの区切り文字に共通です。
JosefSábl2014

1
これは、より適切であろう:Number(yourNumberOrString).toLocaleString()
ジョナサン

2
英語フォーマットが必要な英語以外のロケールのブラウザをサポートするには、を使用しますvalue.toLocaleString('en')。浮動小数点でも機能します。
Klaas van Aarsen、2015

1
@ Serhiog.Lazin Safari(およびどのOSとどのバージョン)で正確に機能しないのですか?
カイザー

35

ECMAScript2018の変更に合わせて後読みサポートを使用して更新されました。
下位互換性を保つために、さらに下にスクロールして元のソリューションを確認してください。

正規表現を使用することができます-特に文字列として格納されている大きな数を処理するのに役立ちます。

const format = num => 
    String(num).replace(/(?<!\..*)(\d)(?=(?:\d{3})+(?:\.|$))/g, '$1,')

;[
    format(100),                           // "100"
    format(1000),                          // "1,000"
    format(1e10),                          // "10,000,000,000"  
    format(1000.001001),                   // "1,000.001001"
    format('100000000000000.001001001001') // "100,000,000,000,000.001001001001
]
    .forEach(n => console.log(n))

»詳細な正規表現の説明(regex101.com) フロー図


この元の回答は必要ない場合がありますが、下位互換性のために使用できます。

これを単一の正規表現(コールバックなし)で処理しようとすると、現在の能力はJavascriptで否定的な後読みがないために失敗します。一致のインデックスがピリオドのインデックスの後に表示される場合は、一致を無視します。

const format = num => {
    const n = String(num),
          p = n.indexOf('.')
    return n.replace(
        /\d(?=(?:\d{3})+(?:\.|$))/g,
        (m, i) => p < 0 || i < p ? `${m},` : m
    )
}

;[
    format(100),                           // "100"
    format(1000),                          // "1,000"
    format(1e10),                          // "10,000,000,000"  
    format(1000.001001),                   // "1,000.001001"
    format('100000000000000.001001001001') // "100,000,000,000,000.001001001001
]
    .forEach(n => console.log(n))

»詳細な正規表現の説明(regex101.com)

フロー図


この構文図はregex101.comで作成されましたか?
Gerold Broser

小数のある数値はどうなりますか?
エミリアーノ

「無効な正規表現:無効なグループ指定子名」を取得しています。React Native 0.59ではこれを行っていますが、RegExには影響しません。
Joshua Pinter

@JoshuaPinterこれは、現時点ではすべてのプラットフォームでサポートされていない後読みの使用になります。iOSについて具体的に言及していると思いますが、Safariでもまだ失敗します。現時点では、下位互換性のあるバージョンを使用するのが最善です。私は自分の答えを将来にわたって保証しようとしていました。 caniuse.com/#search=lookbehind
使者

1
@Emissary先端をありがとう。ええ、それは比較的古いバージョンのJavaScriptCore(JSC)を使用するReact Native 0.59 / Android上にあります。JSCのアップデートを含むReact Native 0.60+にアップデートした後で、もう一度やり直します。
Joshua Pinter

10

素敵なjQuery番号プラグインがあります:https : //github.com/teamdf/jquery-number

10進数と1000と1000の区切り文字のオプションを使用して、好きな形式で任意の数値を変更できます。

$.number(12345.4556, 2);          // -> 12,345.46
$.number(12345.4556, 3, ',', ' ') // -> 12 345,456

上記と同じオプションを使用して、入力フィールド内で直接使用できます。

$("input").number(true, 2);

または、selectorを使用してDOM要素のセット全体に適用できます。

$('span.number').number(true, 2);

最高のソリューションimho
ミハル

私はそうは思いません、ほぼ800行の新しいファイル要件を追加します。それは、手榴弾でアリを殺すようなものです
Emiliano


5
// thousand separates a digit-only string using commas
// by element:  onkeyup = "ThousandSeparate(this)"
// by ID:       onkeyup = "ThousandSeparate('txt1','lbl1')"
function ThousandSeparate()
{
    if (arguments.length == 1)
    {
        var V = arguments[0].value;
        V = V.replace(/,/g,'');
        var R = new RegExp('(-?[0-9]+)([0-9]{3})'); 
        while(R.test(V))
        {
            V = V.replace(R, '$1,$2');
        }
        arguments[0].value = V;
    }
    else  if ( arguments.length == 2)
    {
        var V = document.getElementById(arguments[0]).value;
        var R = new RegExp('(-?[0-9]+)([0-9]{3})'); 
        while(R.test(V))
        {
            V = V.replace(R, '$1,$2');
        }
        document.getElementById(arguments[1]).innerHTML = V;
    }
    else return false;
}   


3

JavaScriptを使用できます。以下はコードです、それはaccept数値と1つだけになりますdot

ここにjavascriptがあります

<script >

            function FormatCurrency(ctrl) {
                //Check if arrow keys are pressed - we want to allow navigation around textbox using arrow keys
                if (event.keyCode == 37 || event.keyCode == 38 || event.keyCode == 39 || event.keyCode == 40) {
                    return;
                }

                var val = ctrl.value;

                val = val.replace(/,/g, "")
                ctrl.value = "";
                val += '';
                x = val.split('.');
                x1 = x[0];
                x2 = x.length > 1 ? '.' + x[1] : '';

                var rgx = /(\d+)(\d{3})/;

                while (rgx.test(x1)) {
                    x1 = x1.replace(rgx, '$1' + ',' + '$2');
                }

                ctrl.value = x1 + x2;
            }

            function CheckNumeric() {
                return event.keyCode >= 48 && event.keyCode <= 57 || event.keyCode == 46;
            }

  </script>

HTML

<input type="text" onkeypress="return CheckNumeric()" onkeyup="FormatCurrency(this)" />

デモJSFIDDLE



2
number = 123456.7089;
result = parseInt( number ).toLocaleString() + "<br>";
result = number.toLocaleString( 'pt-BR' ) + "<br>";

var el = document.getElementById( 'result' );
el.innerHTML = result;
<div id="result"></div>

6
このコードが実際に問題を解決する方法をopおよび他の人々が理解できるように、いくつかの説明も追加してください。ありがとう
Punit Gajjar 2017

1000と9999の11歳のティーンで試してみる
エミリアーノ

1

あなたがする必要があるのは本当にこれだけです:

123000.9123.toLocaleString()
//result will be "123,000.912"

残念ながらそれはあなたのプラットフォームに依存します。いくつかはtoLocaleString()、カンマを追加しないか、または標準の他の機能を欠いています。toLocaleString存在を確認するのは簡単ですが、コンプライアンスを確認するのは簡単ではありません。
ヒッピートレイル2017年

1000〜9999の数字で試してください
Emiliano

0

反応のためのソリューションの組み合わせ

  let converter = Intl.NumberFormat();
  let salary =  monthlySalary.replace(/,/g,'')
  console.log(converter.format(salary))

  this.setState({
    monthlySalary: converter.format(salary)
  })
}

handleOnChangeMonthlySalary(1000)```

0

ngx-format-fieldを使用できます。これは、ビューに表示される入力値をフォーマットするためのディレクティブです。バックエンドに保存される入力値は操作しません。こちらのリンクをご覧ください

例:

component.html:

<input type="text" formControlName="currency" [appFormatFields]="CURRENCY"
(change)="onChangeCurrency()">

component.ts

onChangeCurrency() {
this.currency.patchValue(this.currency.value);
}

デモを見るには:こちら


0

次の関数を使用できます。

function format(number, decimals = 2, decimalSeparator = '.', thousandsSeparator = ',') {
  const roundedNumber = number.toFixed(decimals);
  let integerPart = '',
    fractionalPart = '';
  if (decimals == 0) {
    integerPart = roundedNumber;
    decimalSeparator = '';
  } else {
    let numberParts = roundedNumber.split('.');
    integerPart = numberParts[0];
    fractionalPart = numberParts[1];
  }
  integerPart = integerPart.replace(/(\d)(?=(\d{3})+(?!\d))/g, `$1${thousandsSeparator}`);
  return `${integerPart}${decimalSeparator}${fractionalPart}`;
}

// Use Example

let min = 1556454.0001;
let max = 15556982.9999;

console.time('number format');
for (let i = 0; i < 15; i++) {
  let randomNumber = Math.random() * (max - min) + min;
  let formated = format(randomNumber, 4, ',', '.'); // formated number

  console.log('number: ', randomNumber, '; formated: ', formated);
}
console.timeEnd('number format');


混乱させないでください。toLocaleString()を使用してください。developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…の
Sajad Saderi

@sajadsaderi toLocaleString()フレンドも使用しますが、この関数は柔軟性をあまり与えないため、この関数の定義はnumber_formatと同じであるため、地域の省略形を処理する必要はなく、他の誰かがそれを使用できます()phpの機能。
jin_maxtor

-1

ここでの答えはどれも気に入らなかったので、自分に役立つ関数を作成しました。誰か他の人が役に立ったと思って共有したいだけです。

function getFormattedCurrency(num) {
    num = num.toFixed(2)
    var cents = (num - Math.floor(num)).toFixed(2);
    return Math.floor(num).toLocaleString() + '.' + cents.split('.')[1];
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.