如何使用JavaScript将字符串的波斯语和阿拉伯语数字转换为英语?
如何使用简单的函数将波斯语/阿拉伯语数字转换为英语数字如何使用JavaScript将字符串的波斯语和阿拉伯语数字转换为英语?,javascript,arabic,farsi,Javascript,Arabic,Farsi,如何使用简单的函数将波斯语/阿拉伯语数字转换为英语数字 arabicNumbers = ["١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩", "٠"] persianNumbers = ["۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹", "۰"] 它是相同的架构,但代码页不同。使用此简单函数转换字符串 您可以这样做,使用字符串中数字的索引进行转换: //如果'fromNum'不是数字字符,则返回-1 函数conve
arabicNumbers = ["١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩", "٠"]
persianNumbers = ["۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹", "۰"]
它是相同的架构,但代码页不同。使用此简单函数转换字符串
您可以这样做,使用字符串中数字的索引进行转换:
//如果'fromNum'不是数字字符,则返回-1
函数convertNumber(fromNum){
变量persianNums=‘۰١۲۳۴۶۷۸۹’;
返回persianNums.indexOf(fromNum);
}
var testNum=‘۴’;
警报(“编号为:“+convertNumber(testNum))代码>将任何波斯语或阿拉伯语(或混合)数字转换为“英语”数字()
var transformNumbers=(函数(){
变量数字={
波斯语:[“۰”、“۱”、“۲”、“۳”、“۴”、“۵”、“۶”、“۷”、“۸”、“۹”],
阿拉伯语:[“٠”、“١”、“٢”、“٣”、“٤”、“٥”、“٦”、“٧”、“٨”、“٩”]
};
函数来自英语(str,lang){
变量i,len=str.length,结果=”;
对于(i=0;i
输入{宽度:90%;边距底部:1em;字体大小:1.5em;填充:5px;}
这是一种简单的方法:
function toEnglishDigits(str) {
// convert persian digits [۰۱۲۳۴۵۶۷۸۹]
var e = '۰'.charCodeAt(0);
str = str.replace(/[۰-۹]/g, function(t) {
return t.charCodeAt(0) - e;
});
// convert arabic indic digits [٠١٢٣٤٥٦٧٨٩]
e = '٠'.charCodeAt(0);
str = str.replace(/[٠-٩]/g, function(t) {
return t.charCodeAt(0) - e;
});
return str;
}
例如:
console.log(toEnglishDigits("abc[0123456789][٠١٢٣٤٥٦٧٨٩][۰۱۲۳۴۵۶۷۸۹]"));
// expected result => abc[0123456789][0123456789][0123456789]
返回数组中数字索引的最佳方法:
String.prototype.toEnglishDigits = function () {
return this.replace(/[۰-۹]/g, function (chr) {
var persian = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'];
return persian.indexOf(chr);
});
};
简单明了
"۰۱۲۳۴۵۶۷۸۹".replace(/([۰-۹])/g, function(token) { return String.fromCharCode(token.charCodeAt(0) - 1728); });
或者以更现代的方式
"۰۱۲۳۴۵۶۷۸۹".replace(/([۰-۹])/g, token => String.fromCharCode(token.charCodeAt(0) - 1728));
英语、阿拉伯语和波斯语数字之间所有6种可能的翻译的Oneliner
const e2p = s => s.replace(/\d/g, d => '۰۱۲۳۴۵۶۷۸۹'[d])
const e2a = s => s.replace(/\d/g, d => '٠١٢٣٤٥٦٧٨٩'[d])
const p2e = s => s.replace(/[۰-۹]/g, d => '۰۱۲۳۴۵۶۷۸۹'.indexOf(d))
const a2e = s => s.replace(/[٠-٩]/g, d => '٠١٢٣٤٥٦٧٨٩'.indexOf(d))
const p2a = s => s.replace(/[۰-۹]/g, d => '٠١٢٣٤٥٦٧٨٩'['۰۱۲۳۴۵۶۷۸۹'.indexOf(d)])
const a2p = s => s.replace(/[٠-٩]/g, d => '۰۱۲۳۴۵۶۷۸۹'['٠١٢٣٤٥٦٧٨٩'.indexOf(d)])
e2p("asdf1234") // asdf۱۲۳۴
e2a("asdf1234") // asdf١٢٣٤
p2e("asdf۱۲۳۴") // asdf1234
a2e("asdf١٢٣٤") // asdf1234
p2a("asdf۱۲۳۴") // asdf١٢٣٤
a2p("asdf١٢٣٤") // asdf۱۲۳۴
解释:
(s=>f(s))(x)
是一个立即执行的lambda函数,它将等于f(x)
s.replace(模式,函数)
在s中查找模式的匹配项,对于每个匹配项m,它将用字符串中的function(m)
替换m
/\d/g
是一种正则表达式模式,\d
表示英语中的数字,g
表示全局。如果不指定g
,它将只匹配第一个匹配项,否则将匹配所有匹配项
- 在这种情况下,对于字符串中的每个英文数字
d
,该数字将被替换为“d”
,因此,3将被该列表中的第三个索引(“code>”替换为“d”)
/[۰-۹]/g
是波斯语数字的等效正则表达式这次我们不能使用相同的方法,因为我们利用了javascript是动态键入的,并且d会自动从字符串(正则表达式匹配)转换为数字(数组索引)(您可以执行'1234'['1']
在javascript中,与'1234'[1]
相同)
- 但是这次我们不能这样做,因为
'1234'['۱']
是无效的。因此,我们在这里使用了一个技巧,并使用了一个函数,它告诉我们数组中元素的索引(这里是字符串中的字符),因此,'
如果字符串可能同时包含阿拉伯数字和“波斯”数字,则一行“替换”可以执行以下操作
阿拉伯语和波斯语的数字被转换成英语的等价物。其他案文保持不变
Num=“٣٦٦۵任何٥۵٤۶32٠۰”//输出应为“33665any55453200”
数字=Num.replace(/[£-٩]/g,d=>“١£٤£٦٨٩”。indexOf(d))。replace(/[۰-۹]/g,d=>“indexOf(d));
console.log(Num)代码>您可以使用新的库,这是一个很棒的javascript库来处理波斯语单词和数字。以下是您要求的任务的示例:
import { digitsArToFa, digitsArToEn, digitsEnToFa, digitsFaToEn } from "persian-tools2";
digitsArToFa("٠١٢٣٤٥٦٧٨٩"); // "۰۱۲۳۴۵۶۷۸۹"
digitsArToEn("٠١٢٣٤٥٦٧٨٩"); // "0123456789"
digitsEnToFa("123۴۵۶"); // "۱۲۳۴۵۶"
digitsFaToEn("۰۱۲۳۴۵۶۷۸۹"); // "0123456789"
您还可以在库的存储库页面上找到许多其他有用的功能。对于使用typescript的React解决方案,这可能很有用:
// https://gist.github.com/alieslamifard/364862613408a98139da3cab40abbeb9
import React, { InputHTMLAttributes, useEffect, useRef } from 'react';
// Persian/Arabic To English Digit
const f2e = (event) => {
event.target.value = event.target.value
.replace(/[٠-٩]/g, (d) => '٠١٢٣٤٥٦٧٨٩'.indexOf(d))
.replace(/[۰-۹]/g, (d) => '۰۱۲۳۴۵۶۷۸۹'.indexOf(d));
return event;
};
const useForwardedRef = (ref) => {
const innerRef = useRef(null);
useEffect(() => {
if (!ref) return;
if (typeof ref === 'function') {
ref(innerRef.current);
} else {
ref.current = innerRef.current;
}
}, [ref]);
return innerRef;
};
const Input = React.forwardRef<HTMLInputElement, InputHTMLAttributes<HTMLInputElement>>(
(props, ref) => {
const innerRef = useForwardedRef(ref);
useEffect(() => {
innerRef.current?.addEventListener('keyup', f2e);
return () => {
innerRef.current?.removeEventListener('keyup', f2e);
};
}, [innerRef]);
return <input {...props} ref={innerRef} />;
},
);
export default Input;
//https://gist.github.com/alieslamifard/364862613408a98139da3cab40abbeb9
从'React'导入React,{inputtmlattributes,useffect,useRef};
//波斯语/阿拉伯语到英语数字
常数f2e=(事件)=>{
event.target.value=event.target.value
.替换(/[٠-٩]/g,(d)=>“١١٤٥٦٧٨٩”。索引(d))
.替换(/[۰-۹]/g,(d)=>“d”索引;
返回事件;
};
常量useForwardedRef=(ref)=>{
const innerRef=useRef(null);
useffect(()=>{
如果(!ref)返回;
if(typeof ref==‘function’){
ref(内部参考电流);
}否则{
参考电流=内部参考电流;
}
},[ref]);
返回innerRef;
};
常量输入=React.forwardRef(
(道具,参考)=>{
const innerRef=useForwardedRef(ref);
useffect(()=>{
innerRef.current?addEventListener('keyup',f2e);
return()=>{
innerRef.current?removeEventListener('keyup',f2e
function toEnglishDigits(str) {
const persianNumbers = ["۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹", "۰"]
const arabicNumbers = ["١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩", "٠"]
const englishNumbers = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"]
return str.split("").map(c => englishNumbers[persianNumbers.indexOf(c)] ||
englishNumbers[arabicNumbers.indexOf(c)] || c).join("")
}
toEnglishDigits("۶٦۵any٥32") // "665any532"
import { digitsArToFa, digitsArToEn, digitsEnToFa, digitsFaToEn } from "persian-tools2";
digitsArToFa("٠١٢٣٤٥٦٧٨٩"); // "۰۱۲۳۴۵۶۷۸۹"
digitsArToEn("٠١٢٣٤٥٦٧٨٩"); // "0123456789"
digitsEnToFa("123۴۵۶"); // "۱۲۳۴۵۶"
digitsFaToEn("۰۱۲۳۴۵۶۷۸۹"); // "0123456789"
// https://gist.github.com/alieslamifard/364862613408a98139da3cab40abbeb9
import React, { InputHTMLAttributes, useEffect, useRef } from 'react';
// Persian/Arabic To English Digit
const f2e = (event) => {
event.target.value = event.target.value
.replace(/[٠-٩]/g, (d) => '٠١٢٣٤٥٦٧٨٩'.indexOf(d))
.replace(/[۰-۹]/g, (d) => '۰۱۲۳۴۵۶۷۸۹'.indexOf(d));
return event;
};
const useForwardedRef = (ref) => {
const innerRef = useRef(null);
useEffect(() => {
if (!ref) return;
if (typeof ref === 'function') {
ref(innerRef.current);
} else {
ref.current = innerRef.current;
}
}, [ref]);
return innerRef;
};
const Input = React.forwardRef<HTMLInputElement, InputHTMLAttributes<HTMLInputElement>>(
(props, ref) => {
const innerRef = useForwardedRef(ref);
useEffect(() => {
innerRef.current?.addEventListener('keyup', f2e);
return () => {
innerRef.current?.removeEventListener('keyup', f2e);
};
}, [innerRef]);
return <input {...props} ref={innerRef} />;
},
);
export default Input;