Добавьте запятые или пробелы для группировки каждые три цифры
У меня есть функция для добавления запятых в числа:
function commafy( num ) {
num.toString().replace( /\B(?=(?:\d{3})+)$/g, "," );
}
К сожалению, он не очень похож на десятичные знаки. Учитывая следующие примеры использования, какой лучший способ расширить мою функцию?
commafy( "123" ) // "123"
commafy( "1234" ) // "1234"
// Don't add commas until 5 integer digits
commafy( "12345" ) // "12,345"
commafy( "1234567" ) // "1,234,567"
commafy( "12345.2" ) // "12,345.2"
commafy( "12345.6789" ) // "12,345.6789"
// Again, nothing until 5
commafy( ".123456" ) // ".123 456"
// Group with spaces (no leading digit)
commafy( "12345.6789012345678" ) // "12,345.678 901 234 567 8"
Предположительно, самый простой способ - сначала разбить на десятичную точку (если она есть). Куда лучше идти оттуда?
Ответы
Ответ 1
Просто разделите на две части с помощью. и отформатировать их индивидуально.
function commafy( num ) {
var str = num.toString().split('.');
if (str[0].length >= 5) {
str[0] = str[0].replace(/(\d)(?=(\d{3})+$)/g, '$1,');
}
if (str[1] && str[1].length >= 5) {
str[1] = str[1].replace(/(\d{3})/g, '$1 ');
}
return str.join('.');
}
Ответ 2
Простое:
var theNumber = 3500;
theNumber.toLocaleString();
Ответ 3
Самый простой способ:
1
var num = 1234567890,
result = num.toLocaleString() ;// result will equal to "1 234 567 890"
2
var num = 1234567.890,
result = num.toLocaleString() + num.toString().slice(num.toString().indexOf('.')) // will equal to 1 234 567.890
3
var num = 1234567.890123,
result = Number(num.toFixed(0)).toLocaleString() + '.' + Number(num.toString().slice(num.toString().indexOf('.')+1)).toLocaleString()
//will equal to 1 234 567.890 123
4
Если вы хотите ',' вместо '':
var num = 1234567.890123,
result = Number(num.toFixed(0)).toLocaleString().split(/\s/).join(',') + '.' + Number(num.toString().slice(num.toString().indexOf('.')+1)).toLocaleString()
//will equal to 1,234,567.890 123
Если вы не работаете, установите параметр, например: "toLocaleString ('ru-RU')"
параметр "en-EN", разделит число на "," вместо "
Все функции, используемые в моем коде, являются встроенными функциями JS. Вы найдете их в GOOGLE или в любом учебнике/книге JS
Ответ 4
Если вас устраивает целочисленная часть (я не смотрел ее близко), то:
function formatDecimal(n) {
n = n.split('.');
return commafy(n[0]) + '.' + n[1];
}
Конечно, вы, возможно, захотите провести некоторое тестирование n сначала, чтобы убедиться, что это нормально, но что логика этого.
Изменить
по электронной почте Ой! пропустил бит пространства! Вы можете использовать то же регулярное выражение, что и запятнать, за исключением пробелов вместо запятых, а затем отменить результат.
Здесь функция, основанная на vol7ron и не использующая reverse:
function formatNum(n) {
var n = ('' + n).split('.');
var num = n[0];
var dec = n[1];
var r, s, t;
if (num.length > 3) {
s = num.length % 3;
if (s) {
t = num.substring(0,s);
num = t + num.substring(s).replace(/(\d{3})/g, ",$1");
} else {
num = num.substring(s).replace(/(\d{3})/g, ",$1").substring(1);
}
}
if (dec && dec.length > 3) {
dec = dec.replace(/(\d{3})/g, "$1 ");
}
return num + (dec? '.' + dec : '');
}
Ответ 5
Здесь вы редактируете после прочтения своих комментариев.
function commafy( arg ) {
arg += ''; // stringify
var num = arg.split('.'); // incase decimals
if (typeof num[0] !== 'undefined'){
var int = num[0]; // integer part
if (int.length > 4){
int = int.split('').reverse().join(''); // reverse
int = int.replace(/(\d{3})/g, "$1,"); // add commas
int = int.split('').reverse().join(''); // unreverse
}
}
if (typeof num[1] !== 'undefined'){
var dec = num[1]; // float part
if (dec.length > 4){
dec = dec.replace(/(\d{3})/g, "$1 "); // add spaces
}
}
return (typeof num[0] !== 'undefined'?int:'')
+ (typeof num[1] !== 'undefined'?'.'+dec:'');
}
Ответ 6
Это сработало для меня:
function commafy(inVal){
var arrWhole = inVal.split(".");
var arrTheNumber = arrWhole[0].split("").reverse();
var newNum = Array();
for(var i=0; i<arrTheNumber.length; i++){
newNum[newNum.length] = ((i%3===2) && (i<arrTheNumber.length-1)) ? "," + arrTheNumber[i]: arrTheNumber[i];
}
var returnNum = newNum.reverse().join("");
if(arrWhole[1]){
returnNum += "." + arrWhole[1];
}
return returnNum;
}
Ответ 7
Я добавил #RobG ответ немного больше и сделал образец jsfiddle
function formatNum(n, prec, currSign) {
if(prec==null) prec=2;
var n = ('' + parseFloat(n).toFixed(prec).toString()).split('.');
var num = n[0];
var dec = n[1];
var r, s, t;
if (num.length > 3) {
s = num.length % 3;
if (s) {
t = num.substring(0,s);
num = t + num.substring(s).replace(/(\d{3})/g, ",$1");
} else {
num = num.substring(s).replace(/(\d{3})/g, ",$1").substring(1);
}
}
return (currSign == null ? "": currSign +" ") + num + (dec? '.' + dec : '');
}
alert(formatNum(123545.3434));
alert(formatNum(123545.3434,2));
alert(formatNum(123545.3434,2,'€'));
и расширена так же, как ответ #Ghostoy
function commafy( num, prec, currSign ) {
if(prec==null) prec=2;
var str = parseFloat(num).toFixed(prec).toString().split('.');
if (str[0].length >= 5) {
str[0] = str[0].replace(/(\d)(?=(\d{3})+$)/g, '$1,');
}
if (str[1] && str[1].length >= 5) {
str[1] = str[1].replace(/(\d{3})/g, '$1 ');
}
return (currSign == null ? "": currSign +" ") + str.join('.');
}
alert(commafy(123545.3434));
Ответ 8
Предполагая, что ваши примеры использования не отражают уже действующий код, но вместо этого желаемое поведение, и вы ищете помощь по алгоритму, я думаю, что вы уже на правильном пути с разбиением на любые десятичные числа.
После разделения примените существующее регулярное выражение к левой стороне, аналогичное регулярное выражение, добавляющее пробелы вместо запятых вправо, а затем снова присоедините их к одной строке перед возвратом.
Если, конечно, нет других соображений или я неправильно понял ваш вопрос.
Ответ 9
Вот два лаконичных способа, которые я считаю полезными:
- Number.prototype.toLocaleString
Этот метод может преобразовать число в строку с чувствительным к языку представлением. Это позволяет два параметра, которые являются locales
& options
. Эти параметры могут быть немного запутанными, для более подробной информации смотрите документ из MDN выше.
Одним словом, вы можете просто использовать, как показано ниже:
console.log(
Number(1234567890.12).toLocaleString()
)
// log -> "1,234,567,890.12"
Если вы со мной по-другому, потому что мы игнорируем оба параметра и в вашей операционной системе будет возвращена строковая база.
- Используйте регулярное выражение, чтобы соответствовать строке, а затем заменить на новую строку.
Почему мы считаем это? toLocaleString()
немного сбивает с толку, и не все браузеры поддерживаются, также toLocaleString()
десятичную дробь, поэтому мы можем сделать это другим способом.
// The steps we follow are:
// 1. Converts a number(integer) to a string.
// 2. Reverses the string.
// 3. Replace the reversed string to a new string with the Regex
// 4. Reverses the new string to get what we want.
// This method is use to reverse a string.
function reverseString(str) {
return str.split("").reverse().join("");
}
/**
* @param {string | number}
*/
function groupDigital(num) {
const emptyStr = '';
const group_regex = /\d{3}/g;
// delete extra comma by regex replace.
const trimComma = str => str.replace(/^[,]+|[,]+$/g, emptyStr)
const str = num + emptyStr;
const [integer, decimal] = str.split('.')
const conversed = reverseString(integer);
const grouped = trimComma(reverseString(
conversed.replace(/\d{3}/g, match => '${match},')
));
return !decimal ? grouped : '${grouped}.${decimal}';
}
console.log(groupDigital(1234567890.1234)) // 1,234,567,890.1234
console.log(groupDigital(123456)) // 123,456
console.log(groupDigital("12.000000001")) // 12.000000001