我正试图使用来自外部来源的DOM,其中包含一些以印地语/阿拉伯语转录的数字值,例如"۱۶۶۰"
,但当我想将其转换为数字值时,我得到了NaN
。
这里出了什么问题?
一个可以尝试的小代码片段:
alert(Number("۱۶۶۰") + ' - ' + Number("1660"));
我正试图使用来自外部来源的DOM,其中包含一些以印地语/阿拉伯语转录的数字值,例如"۱۶۶۰"
,但当我想将其转换为数字值时,我得到了NaN
。
这里出了什么问题?
一个可以尝试的小代码片段:
alert(Number("۱۶۶۰") + ' - ' + Number("1660"));
好的,Number
函数只接受0到9的数字,不支持阿拉伯数字,您需要自行处理。
function parseArabic(str) {
return Number(str
.replace(/[٠١٢٣٤٥٦٧٨٩]/g, d => d.charCodeAt(0) - 1632) // convert Arabic digits
.replace(/[۰۱۲۳۴۵۶۷۸۹]/g, d => d.charCodeAt(0) - 1776) // convert Persian digits
);
}
// usage example:
console.log( parseArabic("۱۶۶۰") )
function eurToArab(num) {
return num.toString().replace(/\d/g, function(d) {
return String.fromCharCode(parseInt(d[0], 10) + 1632);
});
}
- Haroen Viaene我建议您从更低的层面处理它:用相应的ASCII数字替换阿拉伯数字,然后进行转换。
例如:
>a='\u0661\u0666\u0666\u0660'
"١٦٦٠"
>b='\u06f1\u06f6\u06f6\u06f0'
"۱۶۶۰"
>r=/[\u0660-\u0669\u06F0-\u06F9]/g;
/[\u0660-\u0669\u06F0-\u06F9]/g
>a.replace(r,function(c) { return '0123456789'[c.charCodeAt(0)&0xf]; } )
"1660"
>b.replace(r,function(c) { return '0123456789'[c.charCodeAt(0)&0xf]; } )
"1660"
function parseNumber(numberText: string) {
return Number(
// Convert Persian (and Arabic) digits to Latin digits
normalizeDigits(numberText)
// Convert Persian/Arabic decimal separator to English decimal separator (dot)
.replace(/٫/g, ".")
// Remove other characters such as thousands separators
.replace(/[^\d.]/g, "")
);
}
const persianDigitsRegex = [/۰/g, /۱/g, /۲/g, /۳/g, /۴/g, /۵/g, /۶/g, /۷/g, /۸/g, /۹/g];
const arabicDigitsRegex = [/٠/g, /١/g, /٢/g, /٣/g, /٤/g, /٥/g, /٦/g, /٧/g, /٨/g, /٩/g];
function normalizeDigits(text: string) {
for (let i = 0; i < 10; i++) {
text = text
.replace(persianDigitsRegex[i], i.toString())
.replace(arabicDigitsRegex[i], i.toString());
}
return text;
}
let numberString = "۱۲۳۴.5678";
let number = parseNumber(numberString);
val formatted1 = number.toLocaleString("fa"); // OR "fa-IR" for IRAN
val formatted2 = number.toLocaleString("en"); // OR "en-US" for USA
val formatted3 = number.toLocaleString("ar-EG"); // OR "ar" which uses western numerals
有关数字格式的更多信息,请参阅此答案。
parseLocale
方法。 - Saeed Neamati