Gibt es eine einfache Möglichkeit, Zahlen in JavaScript zu formatieren, ähnlich den in C # (oder VB.NET) über ToString("format_provider")
oder verfügbaren Formatierungsmethoden String.Format()
?
Gibt es eine einfache Möglichkeit, Zahlen in JavaScript zu formatieren, ähnlich den in C # (oder VB.NET) über ToString("format_provider")
oder verfügbaren Formatierungsmethoden String.Format()
?
Antworten:
Sie sollten sich wahrscheinlich das JQuery NUMBERFORMATTER-Plugin ansehen:
Und diese Frage:
Allgemein
In jQuery
Ja, es gibt definitiv eine Möglichkeit, Zahlen in Javascript richtig zu formatieren, zum Beispiel:
var val=2489.8237
val.toFixed(3) //returns 2489.824 (round up)
val.toFixed(2) //returns 2489.82
val.toFixed(7) //returns 2489.8237000 (padding)
Mit der Verwendung von Variablennamen. toFixed .
Und es gibt noch eine andere Funktion toPrecision()
. Für mehr Details können Sie auch besuchen
http://raovishal.blogspot.com/2012/01/number-format-in-javascript.html
Hier ist eine einfache JS-Funktion zum Hinzufügen von Kommas zu einer Ganzzahl im Zeichenfolgenformat. Es werden ganze Zahlen oder Dezimalzahlen verarbeitet. Sie können entweder eine Zahl oder eine Zeichenfolge übergeben. Es wird offensichtlich eine Zeichenfolge zurückgegeben.
function addCommas(str) {
var parts = (str + "").split("."),
main = parts[0],
len = main.length,
output = "",
first = main.charAt(0),
i;
if (first === '-') {
main = main.slice(1);
len = main.length;
} else {
first = "";
}
i = len - 1;
while(i >= 0) {
output = main.charAt(i) + output;
if ((len - i) % 3 === 0 && i > 0) {
output = "," + output;
}
--i;
}
// put sign back
output = first + output;
// put decimal part back
if (parts.length > 1) {
output += "." + parts[1];
}
return output;
}
Hier eine Reihe von Testfällen: http://jsfiddle.net/jfriend00/6y57j/
Sie können sehen, dass es in dieser vorherigen jsFiddle verwendet wird: http://jsfiddle.net/jfriend00/sMnjT/ . Mit einer einfachen Google-Suche nach "Javascript Add Commas" können Sie Funktionen finden, die auch Dezimalzahlen verarbeiten.
Das Konvertieren einer Zahl in eine Zeichenfolge kann auf viele Arten erfolgen. Am einfachsten ist es, es einem String hinzuzufügen:
var myNumber = 3;
var myStr = "" + myNumber; // "3"
Im Kontext Ihrer jsFiddle erhalten Sie Kommas in den Zähler, indem Sie diese Zeile ändern:
jTarget.text(current);
dazu:
jTarget.text(addCommas(current));
Sie können es hier sehen: http://jsfiddle.net/jfriend00/CbjSX/
addCommas()
Funktion hinzugefügt, damit sie für Zahlen mit einem Dezimalteil funktioniert.
Ich habe eine einfache Funktion geschrieben (es wird kein weiteres jQuery-Plugin benötigt !!), die eine Zahl in eine durch Dezimalstellen getrennte Zeichenfolge oder eine leere Zeichenfolge konvertiert, wenn die Zahl zunächst keine Zahl war:
function format(x) {
return isNaN(x)?"":x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
format(578999);
führt zu 578,999
format(10);
führt zu 10
Wenn Sie einen Dezimalpunkt anstelle eines Kommas haben möchten, ersetzen Sie einfach das Komma im Code durch einen Dezimalpunkt.
In einem der Kommentare wurde korrekt angegeben, dass dies nur für Ganzzahlen funktioniert. Mit ein paar kleinen Anpassungen können Sie es auch für Gleitkommazahlen verwenden:
function format(x) {
if(isNaN(x))return "";
n= x.toString().split('.');
return n[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",")+(n.length>1?"."+n[1]:"");
}
"412.8".replace(/\B(?=(\d{3})+(?!\d))/g, ",");
kehrt zurück 412.8
. Ich denke, es könnte zurückkehren412.80
Hier sind einige Lösungen, die alle die Testsuite, die Testsuite und den Benchmark bestehen. Wenn Sie zum Testen kopieren und einfügen möchten, probieren Sie This Gist aus .
Basieren Sie auf https://stackoverflow.com/a/14428340/1877620 , aber korrigieren Sie, wenn kein Dezimalpunkt vorhanden ist.
if (typeof Number.prototype.format === 'undefined') {
Number.prototype.format = function (precision) {
if (!isFinite(this)) {
return this.toString();
}
var a = this.toFixed(precision).split('.');
a[0] = a[0].replace(/\d(?=(\d{3})+$)/g, '$&,');
return a.join('.');
}
}
if (typeof Number.prototype.format1 === 'undefined') {
Number.prototype.format1 = function (precision) {
if (!isFinite(this)) {
return this.toString();
}
var a = this.toFixed(precision).split('.'),
// skip the '-' sign
head = Number(this < 0);
// skip the digits that's before the first thousands separator
head += (a[0].length - head) % 3 || 3;
a[0] = a[0].slice(0, head) + a[0].slice(head).replace(/\d{3}/g, ',$&');
return a.join('.');
};
}
if (typeof Number.prototype.format2 === 'undefined') {
Number.prototype.format2 = function (precision) {
if (!isFinite(this)) {
return this.toString();
}
var a = this.toFixed(precision).split('.');
a[0] = a[0]
.split('').reverse().join('')
.replace(/\d{3}(?=\d)/g, '$&,')
.split('').reverse().join('');
return a.join('.');
};
}
if (typeof Number.prototype.format3 === 'undefined') {
Number.prototype.format3 = function (precision) {
if (!isFinite(this)) {
return this.toString();
}
var a = this.toFixed(precision).split('');
a.push('.');
var i = a.indexOf('.') - 3;
while (i > 0 && a[i-1] !== '-') {
a.splice(i, 0, ',');
i -= 3;
}
a.pop();
return a.join('');
};
}
console.log('======== Demo ========')
var n = 0;
for (var i=1; i<20; i++) {
n = (n * 10) + (i % 10)/100;
console.log(n.format(2), (-n).format(2));
}
Wenn Sie ein benutzerdefiniertes Tausender- oder Dezimaltrennzeichen möchten, verwenden Sie replace ():
123456.78.format(2).replace(',', ' ').replace('.', ' ');
function assertEqual(a, b) {
if (a !== b) {
throw a + ' !== ' + b;
}
}
function test(format_function) {
console.log(format_function);
assertEqual('NaN', format_function.call(NaN, 0))
assertEqual('Infinity', format_function.call(Infinity, 0))
assertEqual('-Infinity', format_function.call(-Infinity, 0))
assertEqual('0', format_function.call(0, 0))
assertEqual('0.00', format_function.call(0, 2))
assertEqual('1', format_function.call(1, 0))
assertEqual('-1', format_function.call(-1, 0))
// decimal padding
assertEqual('1.00', format_function.call(1, 2))
assertEqual('-1.00', format_function.call(-1, 2))
// decimal rounding
assertEqual('0.12', format_function.call(0.123456, 2))
assertEqual('0.1235', format_function.call(0.123456, 4))
assertEqual('-0.12', format_function.call(-0.123456, 2))
assertEqual('-0.1235', format_function.call(-0.123456, 4))
// thousands separator
assertEqual('1,234', format_function.call(1234.123456, 0))
assertEqual('12,345', format_function.call(12345.123456, 0))
assertEqual('123,456', format_function.call(123456.123456, 0))
assertEqual('1,234,567', format_function.call(1234567.123456, 0))
assertEqual('12,345,678', format_function.call(12345678.123456, 0))
assertEqual('123,456,789', format_function.call(123456789.123456, 0))
assertEqual('-1,234', format_function.call(-1234.123456, 0))
assertEqual('-12,345', format_function.call(-12345.123456, 0))
assertEqual('-123,456', format_function.call(-123456.123456, 0))
assertEqual('-1,234,567', format_function.call(-1234567.123456, 0))
assertEqual('-12,345,678', format_function.call(-12345678.123456, 0))
assertEqual('-123,456,789', format_function.call(-123456789.123456, 0))
// thousands separator and decimal
assertEqual('1,234.12', format_function.call(1234.123456, 2))
assertEqual('12,345.12', format_function.call(12345.123456, 2))
assertEqual('123,456.12', format_function.call(123456.123456, 2))
assertEqual('1,234,567.12', format_function.call(1234567.123456, 2))
assertEqual('12,345,678.12', format_function.call(12345678.123456, 2))
assertEqual('123,456,789.12', format_function.call(123456789.123456, 2))
assertEqual('-1,234.12', format_function.call(-1234.123456, 2))
assertEqual('-12,345.12', format_function.call(-12345.123456, 2))
assertEqual('-123,456.12', format_function.call(-123456.123456, 2))
assertEqual('-1,234,567.12', format_function.call(-1234567.123456, 2))
assertEqual('-12,345,678.12', format_function.call(-12345678.123456, 2))
assertEqual('-123,456,789.12', format_function.call(-123456789.123456, 2))
}
console.log('======== Testing ========');
test(Number.prototype.format);
test(Number.prototype.format1);
test(Number.prototype.format2);
test(Number.prototype.format3);
function benchmark(f) {
var start = new Date().getTime();
f();
return new Date().getTime() - start;
}
function benchmark_format(f) {
console.log(f);
time = benchmark(function () {
for (var i = 0; i < 100000; i++) {
f.call(123456789, 0);
f.call(123456789, 2);
}
});
console.log(time.format(0) + 'ms');
}
async = [];
function next() {
setTimeout(function () {
f = async.shift();
f && f();
next();
}, 10);
}
console.log('======== Benchmark ========');
async.push(function () { benchmark_format(Number.prototype.format); });
async.push(function () { benchmark_format(Number.prototype.format1); });
async.push(function () { benchmark_format(Number.prototype.format2); });
async.push(function () { benchmark_format(Number.prototype.format3); });
next();
Wenn Sie jQuery nicht verwenden möchten, schauen Sie sich Numeral.js an
Erstens ist das Konvertieren einer Ganzzahl in einen String in JS wirklich einfach:
// Start off with a number
var number = 42;
// Convert into a string by appending an empty (or whatever you like as a string) to it
var string = 42+'';
// No extra conversion is needed, even though you could actually do
var alsoString = number.toString();
Wenn Sie eine Zahl als Zeichenfolge haben und möchten, dass sie in eine Ganzzahl umgewandelt wird, müssen Sie die parseInt(string)
für Ganzzahlen und parseFloat(string)
für Gleitkommazahlen verwenden. Diese beiden Funktionen geben dann die gewünschte Ganzzahl / Float zurück. Beispiel:
// Start off with a float as a string
var stringFloat = '3.14';
// And an int as a string
var stringInt = '42';
// typeof stringInt would give you 'string'
// Get the real float from the string
var realFloat = parseFloat(someFloat);
// Same for the int
var realInt = parseInt(stringInt);
// but typeof realInt will now give you 'number'
Was genau Sie anhängen wollen, bleibt mir aus Ihrer Frage unklar.
parseInt(..., 10)
, um sicherzustellen, dass Base 10 verwendet wird.
XXXXXXX.YYYY
in X,XXX,XXX.YYYY
.
http://code.google.com/p/javascript-number-formatter/ :
AKTUALISIEREN
Wie sagen Tomáš Zato hier eine einzeilige Lösung:
(666.0).toLocaleString()
numObj.toLocaleString([locales [, options]])
die in ECMA-262 5.1 Edition beschrieben:
und wird in zukünftigen Versionen von Browsern funktionieren ...
(6666.0).toLocaleString()
. Sie können jedes Verhalten auch so nennen, wie Sie möchten, wenn Sie wissen, dass solche Kommentare nicht zum Thema gehören und möglicherweise verschwinden. Bitte hören Sie auch auf, mich dazu zu bringen, Ihren Beitrag rückgängig zu machen. Du bist zum Scheitern verurteilt, weil ich es nicht abgelehnt habe ... Ich bevorzuge Kommentare gegenüber Abstimmungen.
Zum Beispiel:
var flt = '5.99';
var nt = '6';
var rflt = parseFloat(flt);
var rnt = parseInt(nt);
Verwenden von JQuery .
$(document).ready(function()
{
//Only number and one dot
function onlyDecimal(element, decimals)
{
$(element).keypress(function(event)
{
num = $(this).val() ;
num = isNaN(num) || num === '' || num === null ? 0.00 : num ;
if ((event.which != 46 || $(this).val().indexOf('.') != -1) && (event.which < 48 || event.which > 57))
{
event.preventDefault();
}
if($(this).val() == parseFloat(num).toFixed(decimals))
{
event.preventDefault();
}
});
}
onlyDecimal("#TextBox1", 3) ;
});
Um eine Dezimalstelle mit 2 Zahlen nach dem Komma zu erhalten, können Sie einfach Folgendes verwenden:
function nformat(a) {
var b = parseInt(parseFloat(a)*100)/100;
return b.toFixed(2);
}
Hier ist eine andere Version:
$.fn.digits = function () {
return this.each(function () {
var value = $(this).text();
var decimal = "";
if (value) {
var pos = value.indexOf(".");
if (pos >= 0) {
decimal = value.substring(pos);
value = value.substring(0, pos);
}
if (value) {
value = value.replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,");
if (!String.isNullOrEmpty(decimal)) value = (value + decimal);
$(this).text(value);
}
}
else {
value = $(this).val()
if (value) {
var pos = value.indexOf(".");
if (pos >= 0) {
decimal = value.substring(pos);
value = value.substring(0, pos);
}
if (value) {
value = value.replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,");
if (!String.isNullOrEmpty(decimal)) value = (value + decimal);
$(this).val(value);
}
}
}
})
};
Ich habe eine einfache Funktion erstellt, vielleicht kann sie jemand verwenden
function secsToTime(secs){
function format(number){
if(number===0){
return '00';
}else {
if (number < 10) {
return '0' + number
} else{
return ''+number;
}
}
}
var minutes = Math.floor(secs/60)%60;
var hours = Math.floor(secs/(60*60))%24;
var days = Math.floor(secs/(60*60*24));
var seconds = Math.floor(secs)%60;
return (days>0? days+"d " : "")+format(hours)+':'+format(minutes)+':'+format(seconds);
}
Dies kann die folgenden Ausgaben erzeugen:
Wenn Sie die Nummer eher für die Ansicht als für die Berechnung formatieren möchten, können Sie diese verwenden
function numberFormat( number ){
var digitCount = (number+"").length;
var formatedNumber = number+"";
var ind = digitCount%3 || 3;
var temparr = formatedNumber.split('');
if( digitCount > 3 && digitCount <= 6 ){
temparr.splice(ind,0,',');
formatedNumber = temparr.join('');
}else if (digitCount >= 7 && digitCount <= 15) {
var temparr2 = temparr.slice(0, ind);
temparr2.push(',');
temparr2.push(temparr[ind]);
temparr2.push(temparr[ind + 1]);
// temparr2.push( temparr[ind + 2] );
if (digitCount >= 7 && digitCount <= 9) {
temparr2.push(" million");
} else if (digitCount >= 10 && digitCount <= 12) {
temparr2.push(" billion");
} else if (digitCount >= 13 && digitCount <= 15) {
temparr2.push(" trillion");
}
formatedNumber = temparr2.join('');
}
return formatedNumber;
}
Eingabe: {Integer} Nummer
Ausgaben: {String} Nummer
22.870 => wenn Nummer 22870
22,87 Millionen => wenn Nummer 2287xxxx (x kann was auch immer sein)
22,87 Milliarden => wenn Nummer 2287xxxxxxx
22,87 Billionen => wenn Nummer 2287xxxxxxxxxx
Du hast die Idee
Um die Antwort von jfriend00 weiter zu verfolgen (ich habe nicht genug Punkte, um sie zu kommentieren), habe ich seine / ihre Antwort auf Folgendes erweitert:
function log(args) {
var str = "";
for (var i = 0; i < arguments.length; i++) {
if (typeof arguments[i] === "object") {
str += JSON.stringify(arguments[i]);
} else {
str += arguments[i];
}
}
var div = document.createElement("div");
div.innerHTML = str;
document.body.appendChild(div);
}
Number.prototype.addCommas = function (str) {
if (str === undefined) {
str = this;
}
var parts = (str + "").split("."),
main = parts[0],
len = main.length,
output = "",
first = main.charAt(0),
i;
if (first === '-') {
main = main.slice(1);
len = main.length;
} else {
first = "";
}
i = len - 1;
while(i >= 0) {
output = main.charAt(i) + output;
if ((len - i) % 3 === 0 && i > 0) {
output = "," + output;
}
--i;
}
// put sign back
output = first + output;
// put decimal part back
if (parts.length > 1) {
output += "." + parts[1];
}
return output;
}
var testCases = [
1, 12, 123, -1234, 12345, 123456, -1234567, 12345678, 123456789,
-1.1, 12.1, 123.1, 1234.1, -12345.1, -123456.1, -1234567.1, 12345678.1, 123456789.1
];
for (var i = 0; i < testCases.length; i++) {
log(testCases[i].addCommas());
}
/*for (var i = 0; i < testCases.length; i++) {
log(Number.addCommas(testCases[i]));
}*/
Darf ich numbro für die auf dem Gebietsschema basierende Formatierung und number-format.js für den allgemeinen Fall vorschlagen . Eine Kombination der beiden kann je nach Anwendungsfall hilfreich sein.
Sie können dies folgendermaßen tun: Sie formatieren also nicht nur die Zahl, sondern können auch als Parameter übergeben, wie viele Dezimalstellen angezeigt werden sollen. Sie legen ein benutzerdefiniertes Dezimal- und Meilentrennzeichen fest.
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}`;
}
Verwenden:
let min = 1556454.0001;
let max = 15556982.9999;
console.time('number format');
for (let i = 0; i < 15000; i++) {
let randomNumber = Math.random() * (max - min) + min;
let formated = format(randomNumber, 4, ',', '.'); // formated number
console.debug('number: ', randomNumber, 'formated: ', formated);
}
console.timeEnd('number format');