나는 2,299.00
문자열로 가지고 있으며 그것을 숫자로 구문 분석하려고합니다. 를 사용해 보았습니다. parseFloat
결과는 2입니다. 쉼표가 문제인 것 같지만이 문제를 어떻게 올바르게 해결할 수 있습니까? 쉼표 만 제거 하시겠습니까?
var x = parseFloat("2,299.00")
alert(x);
나는 2,299.00
문자열로 가지고 있으며 그것을 숫자로 구문 분석하려고합니다. 를 사용해 보았습니다. parseFloat
결과는 2입니다. 쉼표가 문제인 것 같지만이 문제를 어떻게 올바르게 해결할 수 있습니까? 쉼표 만 제거 하시겠습니까?
var x = parseFloat("2,299.00")
alert(x);
답변:
예 쉼표를 제거하십시오.
parseFloat(yournumber.replace(/,/g, ''));
.replace(/,/g, '')
이 정규식은 전역 g
을 사용하여 모두를 대체합니다.
parseFloat("2,000,000.00".replace(',',''))
return 2000
및 2. ,
소수점 이하 자릿수가있는 세계 여러 지역에서 실패 ) (예 : parseFloat("2.000.000,00".replace(',',''))
return). 2
아래의 내 대답에서 전 세계 모든 곳에서 작동하는 것을 참조하십시오.
쉼표를 제거하는 것은 다른 사람들이 주석에서 언급했듯이 많은 로케일에서 쉼표를 사용하여 다른 의미 (예 : 소수점 자리)를 사용하므로 잠재적으로 위험합니다.
나는 당신이 당신의 끈을 어디서 얻었는지 모르지만 세계의 어떤 곳에서 "2,299.00"
=2.299
이 Intl
객체는이 문제를 해결하는 좋은 방법이 될 수 있지만 어떻게 든 Intl.NumberFormat.format()
API 만으로 사양을 제공하고 parse
대응 항목은 없습니다.
문화적 숫자 문자가있는 문자열을 i18n 정상적인 방식으로 시스템에서 인식 할 수있는 숫자로 구문 분석하는 유일한 방법은 CLDR 데이터를 활용하는 라이브러리를 사용하여 숫자 문자열 http : //cldr.unicode 를 형식화하는 모든 가능한 방법을 커버하는 것입니다 . org /
지금까지 내가 본 두 가지 최고의 JS 옵션 :
최신 브라우저에서는 내장 된 Intl.NumberFormat 을 사용하여 브라우저의 숫자 형식을 감지하고 일치하도록 입력을 정규화 할 수 있습니다.
function parseNumber(value, locale = navigator.language) {
const example = Intl.NumberFormat(locale).format('1.1');
const cleanPattern = new RegExp(`[^-+0-9${ example.charAt( 1 ) }]`, 'g');
const cleaned = value.replace(cleanPattern, '');
const normalized = cleaned.replace(example.charAt(1), '.');
return parseFloat(normalized);
}
const corpus = {
'1.123': {
expected: 1.123,
locale: 'en-US'
},
'1,123': {
expected: 1123,
locale: 'en-US'
},
'2.123': {
expected: 2123,
locale: 'fr-FR'
},
'2,123': {
expected: 2.123,
locale: 'fr-FR'
},
}
for (const candidate in corpus) {
const {
locale,
expected
} = corpus[candidate];
const parsed = parseNumber(candidate, locale);
console.log(`${ candidate } in ${ corpus[ candidate ].locale } == ${ expected }? ${ parsed === expected }`);
}
분명히 일부 최적화 및 캐싱의 여지가 있지만 이것은 모든 언어에서 안정적으로 작동합니다.
숫자, 소수점 또는 빼기 기호 ( -
) 가 아닌 것은 제거하십시오 .
var str = "2,299.00";
str = str.replace(/[^\d\.\-]/g, ""); // You might also include + if you want them to be able to type it
var num = parseFloat(str);
과학적 표기법의 숫자에는 작동하지 않습니다. 당신이 그것을 원하는 경우, 변경 replace
추가 라인을 e
, E
그리고 +
허용되는 문자 목록에 :
str = str.replace(/[^\d\.\-eE+]/g, "");
str = str.replace(/(\d+),(?=\d{3}(\D|$))/g, "$1");
이것은 내가 사용할 것이지만 정규식에서는 완전히 쓸모가 없으며 다른 SO 스레드에서 잠시 동안 찾은 것입니다.
parseFloat
었습니다. :-)
일반적으로 숫자 값에 대한 자유 텍스트 입력을 허용하지 않는 입력 필드를 사용하는 것을 고려해야합니다. 그러나 입력 형식을 추측해야하는 경우가있을 수 있습니다. 예를 들어 독일에서 1.234,56은 미국에서 1,234.56을 의미합니다. 쉼표를 십진수로 사용하는 국가 목록은 https://salesforce.stackexchange.com/a/21404 를 참조 하십시오 .
다음 함수를 사용하여 가장 잘 추측하고 숫자가 아닌 모든 문자를 제거합니다.
function parseNumber(strg) {
var strg = strg || "";
var decimal = '.';
strg = strg.replace(/[^0-9$.,]/g, '');
if(strg.indexOf(',') > strg.indexOf('.')) decimal = ',';
if((strg.match(new RegExp("\\" + decimal,"g")) || []).length > 1) decimal="";
if (decimal != "" && (strg.length - strg.indexOf(decimal) - 1 == 3) && strg.indexOf("0" + decimal)!==0) decimal = "";
strg = strg.replace(new RegExp("[^0-9$" + decimal + "]","g"), "");
strg = strg.replace(',', '.');
return parseFloat(strg);
}
여기에서 시도하십시오 : https://plnkr.co/edit/9p5Y6H?p=preview
예 :
1.234,56 € => 1234.56
1,234.56USD => 1234.56
1,234,567€ => 1234567
1.234.567 => 1234567
1,234.567 => 1234.567
1.234 => 1234 // might be wrong - best guess
1,234 => 1234 // might be wrong - best guess
1.2345 => 1.2345
0,123 => 0.123
이 함수에는 한 가지 약점이 있습니다. 1,123 또는 1.123이있는 경우 형식을 추측 할 수 없습니다. 로캘 형식에 따라 둘 다 쉼표 또는 천 단위 구분 기호 일 수 있기 때문입니다. 이 특별한 경우 함수는 구분 기호를 천 단위 구분 기호로 처리하고 1123을 반환합니다.
3,00 €
또한 3.00으로 대체되었습니다. 그냥 참고 3,001
로 포맷 3001
. 이를 방지하려면 입력에 항상 소수점 기호가 있어야합니다. 예를 들어 3,001.00€
3,001.00
올바르게 변환됩니다. 또한 jsfiddle을 업데이트하십시오. 0,124
여전히 124로 변환됩니다
toLocaleString이 포함되어 있지만 구문 분석 방법이 없다는 것은 당혹 스럽습니다 . 적어도 toLocaleString인수가없는 은 IE6 +에서 잘 지원됩니다.
A의 국제화의 솔루션, 나는이 함께했다 :
먼저 사용자의 로케일 소수 구분 기호를 감지하십시오.
var decimalSeparator = 1.1;
decimalSeparator = decimalSeparator.toLocaleString().substring(1, 2);
그런 다음 문자열에 소수점 구분 기호가 두 개 이상 있으면 숫자를 정규화합니다.
var pattern = "([" + decimalSeparator + "])(?=.*\\1)";separator
var formatted = valor.replace(new RegExp(pattern, "g"), "");
마지막으로 숫자 또는 소수 구분 기호가 아닌 것은 제거하십시오.
formatted = formatted.replace(new RegExp("[^0-9" + decimalSeparator + "]", "g"), '');
return Number(formatted.replace(decimalSeparator, "."));
이것은 parseFloat
함수를 둘러싼 단순하고 눈에 잘 띄지 않는 래퍼 입니다.
function parseLocaleNumber(str) {
// Detect the user's locale decimal separator:
var decimalSeparator = (1.1).toLocaleString().substring(1, 2);
// Detect the user's locale thousand separator:
var thousandSeparator = (1000).toLocaleString().substring(1, 2);
// In case there are locales that don't use a thousand separator
if (thousandSeparator.match(/\d/))
thousandSeparator = '';
str = str
.replace(new RegExp(thousandSeparator, 'g'), '')
.replace(new RegExp(decimalSeparator), '.')
return parseFloat(str);
}
David Meister가 게시 한 문제를 피하고 소수점 이하 자릿수에 대해 확신하는 경우 모든 점과 쉼표를 대체하고 100으로 나눌 수 있습니다. 예 :
var value = "2,299.00";
var amount = parseFloat(value.replace(/"|\,|\./g, ''))/100;
또는 소수점 3 자리가있는 경우
var value = "2,299.001";
var amount = parseFloat(value.replace(/"|\,|\./g, ''))/1000;
parseInt, parseFloat 또는 Number를 사용하고 싶은지는 당신에게 달려 있습니다. 또한 소수 자릿수를 유지하려면 .toFixed (...) 함수를 사용할 수 있습니다.
이 모든 대답은 수백만 개가 있으면 실패합니다.
3,456,789는 replace 메서드를 사용하여 3456을 반환합니다.
단순히 쉼표를 제거하는 가장 정답은 다음과 같습니다.
var number = '3,456,789.12';
number.split(',').join('');
/* number now equips 3456789.12 */
parseFloat(number);
또는 단순히 작성되었습니다.
number = parseFloat(number.split(',').join(''));
이것은 어떤 로케일의 숫자를 일반 숫자로 변환합니다. 소수점에서도 작동합니다.
function numberFromLocaleString(stringValue, locale){
var parts = Number(1111.11).toLocaleString(locale).replace(/\d+/g,'').split('');
if (stringValue === null)
return null;
if (parts.length==1) {
parts.unshift('');
}
return Number(String(stringValue).replace(new RegExp(parts[0].replace(/\s/g,' '),'g'), '').replace(parts[1],"."));
}
//Use default browser locale
numberFromLocaleString("1,223,333.567") //1223333.567
//Use specific locale
numberFromLocaleString("1 223 333,567", "ru") //1223333.567
이 기능을 사용하면 같은 여러 형식의 값을 포맷 할 수 1.234,56
와 1,234.56
, 심지어와 같은 오류 1.234.56
및1,234,56
/**
* @param {string} value: value to convert
* @param {bool} coerce: force float return or NaN
*/
function parseFloatFromString(value, coerce) {
value = String(value).trim();
if ('' === value) {
return value;
}
// check if the string can be converted to float as-is
var parsed = parseFloat(value);
if (String(parsed) === value) {
return fixDecimals(parsed, 2);
}
// replace arabic numbers by latin
value = value
// arabic
.replace(/[\u0660-\u0669]/g, function(d) {
return d.charCodeAt(0) - 1632;
})
// persian
.replace(/[\u06F0-\u06F9]/g, function(d) {
return d.charCodeAt(0) - 1776;
});
// remove all non-digit characters
var split = value.split(/[^\dE-]+/);
if (1 === split.length) {
// there's no decimal part
return fixDecimals(parseFloat(value), 2);
}
for (var i = 0; i < split.length; i++) {
if ('' === split[i]) {
return coerce ? fixDecimals(parseFloat(0), 2) : NaN;
}
}
// use the last part as decimal
var decimal = split.pop();
// reconstruct the number using dot as decimal separator
return fixDecimals(parseFloat(split.join('') + '.' + decimal), 2);
}
function fixDecimals(num, precision) {
return (Math.floor(num * 100) / 100).toFixed(precision);
}
parseFloatFromString('1.234,56')
"1234.56"
parseFloatFromString('1,234.56')
"1234.56"
parseFloatFromString('1.234.56')
"1234.56"
parseFloatFromString('1,234,56')
"1234.56"
l10n 대답을 원한다면 이렇게하십시오. 예제는 통화를 사용하지만 필요하지 않습니다. 이전 브라우저를 지원해야하는 경우 Intl 라이브러리를 폴리 필해야합니다.
var value = "2,299.00";
var currencyId = "USD";
var nf = new Intl.NumberFormat(undefined, {style:'currency', currency: currencyId, minimumFractionDigits: 2});
value = nf.format(value.replace(/,/g, ""));
replace()
사용하지 않을 때 첫 번째 일치 만 대체합니다 . RegExp
'g'
,
일부 로케일에서 쉼표 구분자에있는 천 단위 구분 기호에 대한 대체가 하드 코딩된다는 사실을 변경하지 않습니다
지원할 작은 로케일 세트가있는 경우 몇 가지 간단한 규칙을 하드 코딩하는 것이 좋습니다.
function parseNumber(str, locale) {
let radix = ',';
if (locale.match(/(en|th)([-_].+)?/)) {
radix = '.';
}
return Number(str
.replace(new RegExp('[^\\d\\' + radix + ']', 'g'), '')
.replace(radix, '.'));
}