بسم الله
أخوانى الكرام قد تناولت موضوع استقبال الأرقام باللغة العربية فى موضوع اخر فى المنتدى
ولكنه لم يستقبل مشاركات كثيرة ربما لانه كان غامضا بعض الشئ
لأنه حتى أنا صاحب الموضوع ظلت عندى مشكلة وهى انى لا أستطيع تحويل الأرقام العربية الى النوع Double
ولكن الان وبعد البحث توصلت للحل ففكرت ان نعرضه ولكن بالشرح والتفصيل لعله يفيد أحد الزملاء
أولا : لتحويل الأرقام الى اللغة العربية نستخدم الفئة java.awt.font.NumericShaper
والتى تحتوى على دالة نقوم من خلالها باستدعاء هذه الفئة ولكن بلغة معينة وتسمىgetShaper
والتى تستقبل متغير من نوع رقم int ويمثل نوع اللغة التى تريد التحويل اليها
وهذه المتغيرات معرفة داخل الفئة الام مسبقا مثل NumericShaper.ARABIC وهو للتغيير الى اللغة العربية
اذا لعمل فئة خاصة نستخدمها دائما فى تحويل الأرقام ولنسميها myConverter
سيكون الكود الى الان كما يلى
import java.awt.font.NumericShaper;
public class myConverter {
NumericShaper shaper=null;
public void useShaper(){
shaper=NumericShaper.getShaper(NumericShaper.ARABIC);// for arabic numbers
}هذا هو الكود الاولى
ولكننا نريد استخدامها فى تغيير نصوص من فئات أخرى نقو م بارسالها اليها باللغة الانجليزية ثم نستقبلها منها مرة أخرى بعد تحويلها الى العربية
اذا سنجرى بعض التعديلات على الكود ليصبح كالتالى
import java.awt.font.NumericShaper;
public class myConverter {
static NumericShaper shaper=null;
public static String useShaper(String englishText){
if(englishText.isEmpty()) return "";// check on text
shaper=NumericShaper.getShaper(NumericShaper.ARABIC);// for arabic numbers return "";
}
}وطبعا عرفنا الدالة والمتغير NumericShaper بالكلمة static لكى نستطيع مناداتها من مكان اخر مباشرة بدون استدعاء الفئة كلها ثم استدعاء الدالة
والمسئول عن تحويل الارقام فى الفئة java.awt.font.NumericShaper هى دالة تسمى shape
وهى تستقبل 3 متغيرات الاول وهو مصفوفة من الحروف char array تمثل الحروف التى تريد تحويلها
والثانى فهرس الحرف او رقم الحرف index الذى تريد ان تبدأ من عنده التحويل
والثالث فهرس الحرف الذى تريد التوقف عنده
وبهذا سنعدل الكود ليصبح كما يلى
public class myConverter {
static NumericShaper shaper=null;
static char[] text=null;
public static String useShaper(String englishText){
if(englishText.isEmpty()) return "";// check on text
shaper=NumericShaper.getShaper(NumericShaper.ARABIC);// for arabic numbers
text=String.valueOf(englishText).toCharArray();// convert text to char array
shaper.shape(text,0,text.length);
return String.valueOf(text);// convert char array to text
}
}أظن الكود بسيط ولا يحتاج لشرح الان يمكننا استخدام هذه الفئة للتحويل ولهذا سنكتب المثال التالى
import java.awt.Dimension;
import java.awt.Rectangle;
import javax.swing.JFrame;
import javax.swing.JTextField;
public class runExample extends JFrame {
private JTextField arabicField = new JTextField();
public runExample() {
try {
jbInit();
}
catch (Exception e) {
e.printStackTrace();
}
}
private void jbInit() throws Exception {
this.getContentPane().setLayout( null );
this.setSize(new Dimension(435, 311));
this.setTitle("الأرقام بين العربية والانجليزية");
arabicField.setBounds(new Rectangle(68, 111, 295, 60));
this.getContentPane().add(arabicField, null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setResizable(false);
}
public static void main(String[] args){
new runExample().setVisible(true);
}
}هذا المثال بسيط جدا يحتوى على صندوق نص واحد فقط والباقى اعدادات النافذة نفسها
والان نريد ان نحول الأرقام التى يقوم المستخدم بادخالها فى الحقل arabicField الى أرقام عربية
وهنا يمكن ان يقول البعض نقوم بعمل متنصت Event Listener على الحقل يقو م بتغيير النص ثم اعادة كتابته فى الحقل
واقرب حل هو استخدام المتنصت عند ضغط اى مفتاح من لوحة المفاتيح KeyListener ونستخدم الدالة keyPressed
وهذا الحل صحيح ولكن ماذا لو قام المستخدم بنسخ نص من مكان اخر ثم لصقه فى هذا الحقل (جرب)
ولهذا سنستخدم المستند Document الموجود داخل الحقل وذلك بمراقبته قبل ادخال النص وهذه أقوى طريقة
ويتم هذا بعمل كائن من javax.swing.text.PlainDocument ونقوم باعادة كتابة Override الدالة المسئولة عن ادخال النص insertString
ونقوم باستخدام الدالة التى صنعناها للتحويل لتحويل النص قبل ادخاله الى الحقل وبهذا نضمن تنفيذ هذه العملية سواء مع الكتابة بلوحة المفاتيح أو نسخ ولصق النصوص
ليصبح الكود كما يلى
import java.awt.Dimension;
import java.awt.Rectangle;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
public class runExample extends JFrame {
private JTextField arabicField = new JTextField();
public runExample() {
try {
jbInit();
}
catch (Exception e) {
e.printStackTrace();
}
}
private void jbInit() throws Exception {
this.getContentPane().setLayout( null );
this.setSize(new Dimension(435, 311));
this.setTitle("الأرقام بين العربية والانجليزية");
arabicField.setBounds(new Rectangle(68, 111, 295, 60));
this.getContentPane().add(arabicField, null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setResizable(false); // -------- note this part -----------------
arabicField.setDocument(new PlainDocument(){
public void insertString(int offset,String newText,AttributeSet a) throws BadLocationException{
super.insertString(offset,myConverter.useShaper(newText),a);
}
});
}
public static void main(String[] args){
new runExample().setVisible(true);
}
}الان يمكنك تجربة المثال الذى صنعته ومحاولة كتابة اولصق ارقام او نصوص تحتوى على أرقام فى هذا الحقل ( ماذا تلاحظ؟ )
هكذا اتممنا النصف الأول من الموضوع وهو تحويل الأرقام الى اللغة العربية
// ***********************************************************
الان نريد ان نستخرج بيانات من نوع Double من الارقام التى يتم ادخالها فى مربع النص arabicField
واستخدامها فى اشياء اخرى وليكن مبدئيا اظهارها فى صندوق حوارى باستخدام JOptionPane
ولهذا سنقوم بتعديل الكود ليصبح هكذا
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
public class runExample extends JFrame {
private JTextField arabicField = new JTextField();
private JButton jButton1 = new JButton();
String myText="";
double result=0;
public runExample() {
try {
jbInit();
}
catch (Exception e) {
e.printStackTrace();
}
}
private void jbInit() throws Exception {
this.getContentPane().setLayout( null );
this.setSize(new Dimension(435, 311));
this.setTitle("الأرقام بين العربية والانجليزية");
arabicField.setBounds(new Rectangle(68, 111, 295, 60));
this.getContentPane().add(jButton1, null);
this.getContentPane().add(arabicField, null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setResizable(false); // -------- note this part -----------------
arabicField.setDocument(new PlainDocument(){
public void insertString(int offset,String newText,AttributeSet a) throws BadLocationException{
super.insertString(offset,myConverter.useShaper(newText),a);
}
});
jButton1.setText("حول الى Double");
jButton1.setBounds(new Rectangle(103, 205, 225, 35));
jButton1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
jButton1_actionPerformed(e);
}
});
}
public static void main(String[] args){
new runExample().setVisible(true);
}
private void jButton1_actionPerformed(ActionEvent e) {
try{
myText=arabicField.getText().trim();
result=Double.parseDouble(myText);
JOptionPane.showMessageDialog(this,result);
}
catch(Exception ex){
JOptionPane.showMessageDialog(this,ex.getMessage());
}
}
}ماذا تلاحظ ؟
لا يمكن تحويل الارقا م العربية الى النوع Double
وهذه هى المشكلة ولحل هذه المشكلة يجب ان نقوم بتحويل الارقام الى اللغة الانجليزية أولا
وهنا نبدأ البحث عن طريقة لتحويل الأرقام من العربية الى الانجليزية
طبعا الكل سيقول ولم البحث كل ماعلينا فعله هو تغيير نوع المتغير الذى ارسلناه الى الدالة المسئولة عن تحويل الارقام الى العربية ونجعلها تحول الارقام الى الانجليزية
وهذا هو الحل الطبيعى ( أرجو منك ان تجربه )
فمثلا بدلا من كتابة السطر التالى
shaper=NumericShaper.getShaper(NumericShaper.ARABIC);// for arabic numbers
نقوم بكتابة سطر اخر ( حاول كتابته انت فليس لدى ما أكتبه هنا واذا نجحت اعرضه الله يجزيك خير )
والان بعد اذنكم أخد ريست لان الكتابة باللغة العربية ترهقنى ونكمل فى المشاركة الثانية
سلام

