Есть ли у кого-нибудь предложение для написания чувствительной к культуре функции ParseFloat в JavaScript, так что когда у меня есть строка 100 000.22 в формате американской культуры, функция float float возвращает 100000.22, тогда как если я войду в 100.000.22 в шведскую культуру, она вернет 100000.22 в float?
Чувствительная к культуре функция ParseFloat в JavaScript?
Ответ 1
Я улучшил функцию mwilcox для обработки значений с разделителями.
function parseFloatOpts (str) {
if(typeof str === "number"){
return str;
}
var ar = str.split(/\.|,/);
var value = '';
for (var i in ar) {
if (i>0 && i==ar.length-1) {
value += ".";
}
value +=ar[i];
}
return Number(value);
}
Ответ 2
Это немного грубо и готово, но этого может быть достаточно, позволяя вам передавать тысячи и десятичные разделители:
function parseFloatOpts(num, decimal, thousands) {
var bits = num.split(decimal, 2),
ones = bits[0].replace(new RegExp('\\' + thousands, 'g'), '');
ones = parseFloat(ones, 10),
decimal = parseFloat('0.' + bits[1], 10);
return ones + decimal;
}
Примеры:
parseFloatOpts("100.000,22", ',', '.'); //100000.22
parseFloatOpts("100,000.22", '.', ','); //100000.22
Обратите внимание, что это не гарантирует, что разделитель тысяч действительно представляет тысячи и т.д., или делает много других гарантий, которые вы, возможно, захотите сделать, в зависимости от важности функции.
Ответ 3
var parse = function(st){
if(st.indexOf(",") === st.length-3){
st = st.replace(".", "").replace(",", ".");
}else{
st = st.replace(",", "");
}
return parseFloat(st, 10)
}
console.log(parse("100,000.22")) // 100000.22
console.log(parse("100.000,22")) // 100000.22
Я просто проверяю, есть ли запятая в третьей позиции. Это может быть дополнительно уточнено, чтобы проверить, существует ли период в 4-й и последней позиции в случае, если он не является запятой (например, 100 000).
Ответ 4
Глядя на lonesomday, я подумал:
Вы также можете сделать:
function parse (str)
var ar = str.split(/\.|,/);
return Number(ar[0]+ar[1]+"."+ar[3]);
Ответ 5
Вот грубая функция. Он примет последнюю пунктуацию, чтобы указать десятичные знаки, будь то запятая, период или любой другой символ, который может вам понадобиться указать. Затем он устраняет другие прерывания от всего числа. Помещает его обратно и анализирует как плавающий.
function normalizeFloat(number, chars) {
var lastIndex = -1;
for(i=0; i < chars.length; i++) {
t = number.lastIndexOf(chars[i]);
if (t > lastIndex) {
lastIndex = t;
}
}
if (lastIndex == -1) {
lastIndex = number.length;
}
var whole = number.substring(0, lastIndex);
var precision = number.substring(lastIndex);
for (i=0; i < chars.length; i++) {
whole = whole.replace(chars[i], '');
precision = precision.replace(chars[i],'.');
}
number = whole + precision;
f = parseFloat(number);
return f;
}
попробуйте следующее:
alert(normalizeFloat('12.345,77', [',','.']).toFixed(2));
alert(normalizeFloat('12,345.77', [',','.']).toFixed(2));
Ответ 6
Нужна текущая группа и десятичный разделитель из информации о культуре.
function escapeRegExp(string) {
return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}
function parseFloatOpts(str, groupSeparator, decimalSeparator) {
if (typeof str === "number") {
return str;
}
var value = str.replace(new RegExp(escapeRegExp(groupSeparator), 'g'), "");
value = value.replace(decimalSeparator, ".");
return Number(value);
}