Thursday, February 11, 2016

Bagaimana membahasakan bilangan dengan JavaFX

Ok saudara sekalian, tanpa berbasa-basi saya akan memberikan sebuah tutorial yang cukup sederhana mengenai bagaimana membuat program yang bisa membahasakan bilangan. Yakni ketika dimasukkan sebuah bilangan maka akan dikeluarkan bagaimana mengucapkannya dalam Bahasa Indonesia. Sebenarnya ini soal klasik. Kalo pembaca sekalian sudah pernah membuat compiler, maka pembaca skip saja tutorial ini. Prinsip kerjanya hampir sama dengan kompiler dalam hal memparsing text dan memetakan nilainya. Dan kalo pembaca benar-benar ingin membuat compiler, ada banyak contoh source code nya di internet.

Namun saya kemarin pernah menjumpai sebuah link di internet tentang sebuah program yang dapat mengcompile segala kemungkinan bahasa pemrograman yang ada. Jadi apapun bahasa pemrograman yang Anda buat, dan bisa dijalankan pada Mesin Turing, maka itu bisa digenerate menggunakan kompiler buatan mereka tersebut. Yakni dengan mengeset sejumlah perintah khusus pada macro nya.

Jadi apa yang saya buat kali ini ga ada sangkut pautnya dengan sebuah pamer keahlian. Saya hanya berbagi rasa. Kali aja ada mahasiswa yang mendapat soal seperti ini (misalnya dari wawancara kerjaan atau tugas dari dosen). Ya, tinggal dihapal aja source code nya dan Anda mendapatkan pekerjaan dengan gaji 7 juta sebulan atau mendapatkan nilai yang bagus.

Tapi kebetulan program bukan manusia, maka tidak selamanya bisa meniru kompleksitas otak manusia. Program itu jalannya logis aja, sementara manusia punya free-will. Bahkan programmer di Facebook yang jumlahnya ratusan tidak bisa menghasilkan translator yang layak pakai buat dipake mentranslate Bahasa Inggris ke dalam Bahasa Indonesia. Dalam program yang saya buat ini ada sedikit kelucuan yang diakibatkan jalannya yang logis logis aja. Misalnya 21 itu kan memang sudah seharusnya dibahasakan dua puluh satu. Yang heran manusia mengadakan pengecualian, yakni 12 bukannya dibahasakan satu puluh dua melainkan dua belas. Saya tidak perlu memasukkan pengecualian tersebut ke dalam program saya, karena ini hanya sebatas tutorial. Kalo iya, tentu saya sudah bisa menjual program saya ini di pasaran dan mendapatkan uang ketimbang sekedar pahala.  Berikut video hasil running program tersebut:

Adapun source code nya adalah:

import java.util.ArrayList;
import java.util.HashMap;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
import javafx.stage.Stage;


public class BilanganToKalimat extends Application{
 
 public String  printBilanganToKalimat(int a ){
  
  HashMap map1 = new HashMap<>(); 
  map1.put(1, "satu"); 
  map1.put(2, "dua");
  map1.put(3, "tiga"); 
  map1.put(4, "empat"); 
  map1.put(5, "lima"); 
  map1.put(6, "enam"); 
  map1.put(7, "tujuh"); 
  map1.put(8, "delapan"); 
  map1.put(9, "sembilan"); 
  map1.put( 0 , ""); 
  
  HashMap map2 = new HashMap<>();
  map2.put(0 , "" ); 
  map2.put(1, "puluh" ); 
  map2.put(2, "ratus" ); 
  map2.put(3, "ribu" ); 
  map2.put(4, "puluh ribu" ); 
  map2.put(5, "ratus ribu" ); 
  map2.put(6, "juta"); 
  map2.put(7, "puluh juta");
  map2.put(8, "ratus juta"); 
  map2.put(9, "miliar"); 
  map2.put(10, "puluh miliar"); 
  map2.put(11, "ratus miliar"); 
  
  
  int m, n; 
  String st = Integer.toString(a); 
  n = m = st.length() - 1;  
  
  StringBuilder builder = new StringBuilder(); 

  ArrayList lst = new ArrayList<>(); 
  
  while( n >=0  ){
   int c =  st.codePointAt(n); 
   c = c - 48; 
   builder.append(map1.get(c)); 
   builder.append(" "); 
   
   if( c!= 0){
    String sebutan = map2.get(m - n); 
    String[] sss = sebutan.split("\\s"); 
    if(sss.length == 2){
     if(!lst.contains(sss[sss.length - 1])){
      builder.append(sebutan); 
      lst.add(sss[sss.length - 1]); 
     }else{
      for( int j = 0; j < sss.length - 1; j++)
       builder.append(sss[j] + " "); 
     }
    }else{
     builder.append(sebutan); 
     lst.add(sebutan); 
    }
    
    builder.append("_");  
   }
   n--; 
  }
  
  String temp[] = builder.toString().split("\\_"); 
  StringBuilder bt = new StringBuilder();
  for( int i = temp.length - 1; i>= 0; i-- ){
   bt.append(temp[i]); 
   bt.append(" ") ; 
  }
   return bt. toString(); 
 }
 
 public static void main(String[] args){
  launch(args);
 }

 @Override
 public void start(Stage primaryStage) throws Exception {
  
  AnchorPane pane = new AnchorPane(); 
  pane.setPrefSize(400, 400); 
  primaryStage.setScene(new Scene(pane));
  
  primaryStage.show();
  initLayout(pane); 
 }
 
 Text area = new Text(); 
 
 private void initLayout(AnchorPane pane){
  
  VBox box = new VBox(); 
  box.setSpacing(10);
  
  TextField input = new TextField(); 
  input.setPrefSize(150, 30); 
  box.getChildren().add(input) ; 
  
  
  Button button = new Button("CONVERT"); 
  button.setPrefSize(150, 30); 

  button.setOnAction(new EventHandler() {
   @Override
   public void handle(ActionEvent arg0) {
    String c = input.getText(); 
    try{
     int a = Integer.parseInt(c); 
     String hasil = printBilanganToKalimat(a); 
     
     area.setText(hasil);
     
    }catch(Exception e){}
   }
  });
  
  box.getChildren().add(button); 

  HBox hbox = new HBox(); 
  hbox.setTranslateX(5);
  hbox.setTranslateY(5); 
  hbox.setSpacing(10);
  hbox.getChildren().add(box); 
  
  box.getChildren().add(area);  
  
  pane.getChildren().add(hbox); 
  
 }
}

No comments: