如何使用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;