Example:
示例:
String replaceFarsiNumber(String input) {
const english = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
const farsi = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'];
for (int i = 0; i < english.length; i++) {
input = input.replaceAll(english[i], farsi[i]);
}
return input;
}
main() {
print(replaceFarsiNumber('0-1-2-3-4-5-6-7-8-9')); // ==> ۰-۱-۲-۳-۴-۵-۶-۷-۸-۹
}
static String ConvertDigitsToLatin(String s) {
var sb = new StringBuffer();
for (int i = 0; i < s.length; i++) {
switch (s[i]) {
//Persian digits
case '\u06f0':
sb.write('0');
break;
case '\u06f1':
sb.write('1');
break;
case '\u06f2':
sb.write('2');
break;
case '\u06f3':
sb.write('3');
break;
case '\u06f4':
sb.write('4');
break;
case '\u06f5':
sb.write('5');
break;
case '\u06f6':
sb.write('6');
break;
case '\u06f7':
sb.write('7');
break;
case '\u06f8':
sb.write('8');
break;
case '\u06f9':
sb.write('9');
break;
//Arabic digits
case '\u0660':
sb.write('0');
break;
case '\u0661':
sb.write('1');
break;
case '\u0662':
sb.write('2');
break;
case '\u0663':
sb.write('3');
break;
case '\u0664':
sb.write('4');
break;
case '\u0665':
sb.write('5');
break;
case '\u0666':
sb.write('6');
break;
case '\u0667':
sb.write('7');
break;
case '\u0668':
sb.write('8');
break;
case '\u0669':
sb.write('9');
break;
default:
sb.write(s[i]);
break;
}
}
return sb.toString();
}
Not sure in what context you're going to use the numbers, but I would rather define a const map:
const numberMap = {0: '۰', 1: '۱', 2:'۲', 3:'۳', 4:'٤', 5:'۵', 6:'٦', 7:'۷', 8:'۸',9: '۹'};
Then you can just call numberMap[number]
to reuse it.
不确定您将在什么上下文中使用这些数字,但我更愿意定义一个常量映射:const number Map={0:‘·’,1:‘۱’,2:‘۲’,3:‘۳’,4:‘٤’,5:‘۵’,6:‘٦’,7:‘۷’,8:‘۸’,9:‘۹’};然后只需调用NumerMap[Number]来重用它。
Depending on this answer: https://stackoverflow.com/a/63934087/14409491
取决于以下答案:https://stackoverflow.com/a/63934087/14409491
extension NumberConverter on num {
static const Map<String, String> arabicDigits = <String, String>{
'0': '\u0660',
'1': '\u0661',
'2': '\u0662',
'3': '\u0663',
'4': '\u0664',
'5': '\u0665',
'6': '\u0666',
'7': '\u0667',
'8': '\u0668',
'9': '\u0669',
};
String toArabicDigits() {
final String number = toString();
StringBuffer sb = StringBuffer();
for (int i = 0; i < number.length; i++) {
sb.write(arabicDigits[number[i]] ?? number[i]);
}
return sb.toString();
}
}
Here is my solution:
以下是我的解决方案:
String engNumberToFarsi(String number) {
Map numbers = {
'0' : '۰',
'1' : '۱',
'2' : '۲',
'3' : '۳',
'4' : '۴',
'5' : '۵',
'6' : '۶',
'7' : '۷',
'8' : '۸',
'9' : '۹',
};
numbers.forEach((key, value) => number = number.replaceAll(key, value));
return number;
}
I'm a bit late to the party but here is a solution using RegExp
and String.replaceAllMapped(...)
:
我参加聚会有点晚了,但这里有一个使用RegExp和String.replaceAllMaps(...)的解决方案:
extension ToFarsiNumber on String {
String toFarsi() {
const Map<String, String> numbers = {
'0': '۰',
'1': '۱',
'2': '۲',
'3': '۳',
'4': '۴',
'5': '۵',
'6': '۶',
'7': '۷',
'8': '۸',
'9': '۹',
};
return replaceAllMapped(
RegExp('[0-9]'),
(match) => numbers[this[match.start]]!,
);
}
}
Usage:
用途:
'0-1-2-3-4-5-6-7-8-9'.toFarsi(); // ۰-۱-۲-۳-۴-۵-۶-۷-۸-۹
import 'package:alert_dialog/alert_dialog.dart';
import 'package:flutter/material.dart';
class Home2 extends StatefulWidget {
const Home2({Key? key}) : super(key: key);
@override
State<Home2> createState() => _Home2State();
}
class _Home2State extends State<Home2> {
String TransformerNum = 'محمود 2026';
TextEditingController TransformerNumController = TextEditingController();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('ArbicNumbers'),),
body: SingleChildScrollView(
child: Column(
children: [
Container(
margin: EdgeInsets.only(top:220,left: 650),
child: Text('${TransformerNum}',style: TextStyle(fontFamily: '(A) Arslan Wessam A', fontSize: 25)),
),
Container(
margin: EdgeInsets.only(top:220,left: 650),
child: ElevatedButton(
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Text('${TransformerNum}',style: TextStyle(fontFamily: '(A) Arslan Wessam A', fontSize: 25)),
SizedBox(width: 10,),
Text('اضف بيانات المحول ',style: TextStyle(fontFamily: '(A) Arslan Wessam A', fontSize: 25)),
],
),
onPressed: () async{
return alert(
context,
title: Column(
children: [
Container(
// margin: EdgeInsets.only(left:200, top: 200, right: 300),
child: TextFormField(
controller: TransformerNumController,
decoration: InputDecoration(
labelText: 'ادخل البيانات',
hintMaxLines: 1,
enabledBorder: const OutlineInputBorder(
borderSide: BorderSide(
color: Colors.blue,
)),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(200)),
prefixIcon: const Icon(
Icons.add_circle_outline_outlined,
color: Colors.blue,
),
fillColor: Colors.lightBlue[50],
filled: true,
hintText: '....... مثال 1او 2 او'),
)
),
],
),
textOK: IconButton(onPressed: (){
setState((){
TransformerNum = replaceFarsiNumber(TransformerNumController.text);
//TransformerNum = TransformerNumController.text;
});
Navigator.of(context).pop();
}, icon: Icon(Icons.add_circle))
);
},
),
)
],
),
),
);
}
String replaceFarsiNumber(String input) {
const english = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
const farsi = ['۰', '۱', '۲', '۳', '۴', '۵', '٦', '۷', '۸', '۹'];
for (int i = 0; i < english.length; i++) {
input = input.replaceAll(english[i], farsi[i]);
}
return input;
}
}
@Xavier answer is correct, however I would suggest to define an extension to use instead of each time wrapping your string with function
@Xavier回答是正确的,但是我建议定义一个扩展来使用,而不是每次都用函数包装字符串
extension FarsiNumberExtension on String {
String get farsiNumber {
const english = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
const farsi = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹'];
String text = this;
for (int i = 0; i < english.length; i++) {
text = text.replaceAll(english[i], farsi[i]);
}
return text;
}
}
and use like this
并像这样使用
print('0-1-2-3-4-5-6-7-8-9'.farsiNumber);
print('myNumber123'.farsiNumber);
output
输出
۰-۱-۲-۳-۴-۵-۶-۷-۸-۹
myNumber۱۲۳
I have published the localizeDigits()
extension method on String in the package hrk_batteries
.
我已经在hrk_batteries包中发布了String上的localizeDigits()扩展方法。
Add the package:
添加程序包:
$ dart pub add hrk_batteries
Use it as follows:
请按如下方式使用它:
localized_digits_example.dart
本地化数字示例.DART
import 'package:hrk_batteries/hrk_batteries.dart';
void main() {
final String enToArLocalizedString = 'A0123456789Z'.localizeDigits(
toZeroDigit: '\u0660', // toZeroDigit: '٠',
);
print(enToArLocalizedString); // A٠١٢٣٤٥٦٧٨٩Z
final String enToFaLocalizedString = 'A0123456789Z'.localizeDigits(
toZeroDigit: '\u06f0', // toZeroDigit: '۰',
);
print(enToFaLocalizedString); // A۰۱۲۳۴۵۶۷۸۹Z
}
更多回答
I think Map
must be defined with {}
instead []
我认为地图必须用{}来定义,而不是[]
ah sorry my bad. Edited.
啊,对不起,是我的错。编辑过的。
Works on Windows
在Windows上运行
Remember that Stack Overflow isn't just intended to solve the immediate problem, but also to help future readers find solutions to similar problems, which requires understanding the underlying code. This is especially important for members of our community who are beginners, and not familiar with the syntax. Given that, can you edit your answer to include an explanation of what you're doing and why you believe it is the best approach?
请记住,Stack Overflow不仅仅是为了解决眼前的问题,也是为了帮助未来的读者找到类似问题的解决方案,这需要理解底层代码。这对于我们社区的初学者和不熟悉语法的成员来说尤其重要。考虑到这一点,你能编辑你的答案,包括你正在做的事情的解释以及为什么你认为这是最好的方法吗?
我是一名优秀的程序员,十分优秀!