Javascript: конвертировать строковое представление денег на номер

Предположим, что у меня есть количество в строчном формате:

amount = '12,000.00'

Я хочу преобразовать его в Number (Javascript) или float.

parseFloat(amount) // this gives me 12 as a result
Number(amount) // this gives me NaN as a result

Другое решение, которое я подумал:

parseFloat(amount.replace(/[,]/g, ''))

Это прекрасно работает. Но проблема здесь в Locale.

Это не удастся, если сумма составит € 12000,00. Здесь ',' имеет совсем другое значение.

Я искал хорошее решение, но не мог. Я ищу обобщенное решение.

3 ответа

Это не так просто, поскольку вы не можете точно знать, что разделитель для тысяч и что для десятичной части

Рассмотрим "12.000.000" это 12000.000 === 12000 или 12000000?

Но если вы установите требование, чтобы последний разделитель всегда был десятичным разделителем - значение, если задан хотя бы один разделитель, последний один имеет как десятичный разделитель *, если следующие цифры не превышают определенную длину.

Затем вы можете попробовать следующее

Изменить

(см. revs, если вас интересует старая функция)

Я установил возможность определять максимальную длину цифр после последнего разделителя "," или ".". до тех пор, пока он не будет обработан как float, после чего его будет возвращено как целое число

var amounts = ["12000","12.000,00", "12,000.00", "12,000,01", "12.000.02", "12,000,001"];
formatMoney.maxDecLength = 3; //Set to Infinity o.s. to disable it
function formatMoney(a) {
 var nums = a.split(/[,\.]/);
 var ret = [nums.slice(0, nums.length - 1).join("")];
 if (nums.length < 2) return +nums[0];
 ret.push(nums[nums.length - 1]);
 return +(ret.join(nums[nums.length - 1].length < formatMoney.maxDecLength ? "." : ""));
}
for ( var i=0,j;j=amounts[i];i++)
 console.log (j + " -> " +formatMoney(j));

Выдает вывод:

"12000 -> 12000"
"12.000,00 -> 12000"
"12,000.00 -> 12000"
"12,000,01 -> 12000.01"
"12.000.02 -> 12000.02"
"12,000,001 -> 12000001" //as you can see after the last "," there are 3 digits and its treated as integer

Другой JSBin


Вы можете получить локальный десятичный разделитель следующим образом:

1.1.toLocaleString().substr(1,1)

Перед обработкой parse float вы можете убедиться, что строка содержит только цифры, возможно знак минус, и локальный десятичный разделитель.


По правде говоря, вы никогда не узнаете формат. 12,345. Это 12345 или другая версия локали, если 12.345?

Однако, если у вас есть последовательные десятичные числа, вы сможете использовать функцию lastIndexOf в запятой, и период будет показать десятичное положение и характер.

var price = '12,345.67';
var lastPeriod = price.lastIndexOf('.');
var lastComma = price.lastIndexOf(',');
if (lastComma != -1 && lastComma > lastPeriod) {
 decimalCharacter = ',';
} else {
 decimalCharacter = '.';
}
console.log(decimalCharacter); //. or , based on how the price string looks - see below

Если price - 12,345.67, decimalCharacter будет .. Если он 12.345,67, он будет возвращен как ,.

licensed under cc by-sa 3.0 with attribution.