[php] Nombor Ke Perkataan?
#1 Guest_xpired_*
Posted 21 June 2004 - 03:20 PM
Nak minta tolong boleh tak? sesiapa tahu camne nak tukar nombor dalam bentuk teks? cthnya
Nombor : 231.10
Teks : Dua Ratus Tiga Puluh Satu Dan Sepuluh
Yang biasa diaorang letak kat bahagian bawah invois tu....
sesiapa sudi persilakan tampil... kepala nie dah berat dah... tak leh pikir ligat lagi dah... anyone??? pleaseeee.....(magic word)
#2
Posted 21 June 2004 - 03:33 PM
{
case "1": teks="satu";break;
case "2" : teks="dua";break;
case "3" : teks="tiga";break;
//dan seterusnya...
default: break;
}
Tapi utk 0 tu jadi puluh..ratus..etc tu..tak terfikir lagi. Hehe..sorri..
#3
Posted 21 June 2004 - 03:43 PM
#4 Guest_xpired_*
Posted 21 June 2004 - 04:03 PM
had nombor hanya sampai 19 juta sahaja... jadi kalau :
No : 4,503,238.56
Teks : Empat Juta Lima Ratus Tiga Ribu Dua Ratus Tiga Puluh Lapan Dan Lima Puluh Enam
#5
Posted 21 June 2004 - 04:48 PM
#7 Guest_ucin_*
Posted 21 June 2004 - 05:16 PM
Katalah ko ade nombo ni
3340
Apa kata mula mula kite letakkan angka2 ni dalam array kite namakan die num:
so:
$num[0]=3
$num[1]=3
$num[2]=4
$num[3]=0
Then kite count size array kite dapat 4 so type dia ialah ribu
amik item 1 tu and simpan dalam variable(maybe another array pastu nanti boleh guna function array append) lain dengan type die so nanti kite akan dapat 3 ribu
Pastu kite delete item yg pertama:
kite ada
$num[1]=3
$num[2]=4
$num[3]=0
Kite count lagi.Ada 3 so type die ialah ratus.Kite simpan item index 1 tu and kite dapat 3 ratus(append dalam array yg kite dah simpan nilai 3 ribu tu)
and so on...
Aku rasa boleh buat recursive function ni and hapuskan array tu one by one and generate teks die yg akan dimpan dalam array yg lain gak....
Hopefuly korang paham le maksud aku nih ek...
#8 Guest_aku_azhar_*
Posted 22 June 2004 - 11:52 AM
aku dah buat dah coding untuk proses tukar nombor ker perkataan ni untuk projek baucer aku
dengan murah hati aku bagi koding nyer terus untuk ko ngan ittutorian yang lain
lagipon banyak input yang aku dapat ngan belaja kat sini
gunakanlah dengan sebaiknya
majulah php untuk negara
p/s:koding ni panjang skit la..hehehe...aku buat ikut logik jer, maybe boleh diperbaiki oleh yang lain
ada 2 fail : index.html / proses_ringgit_malaysia.php (full source kod, copy jekk)
index.html
<head>
<title>Ringgit Malaysia</title>
<script language='Javascript'>
function nombor(TheWin)
{
if((TheWin.event.keyCode >= 48 && TheWin.event.keyCode <= 57) ||
(TheWin.event.keyCode >= 96 && TheWin.event.keyCode <= 105) ||
(TheWin.event.keyCode >= 37 && TheWin.event.keyCode <= 40) ||
TheWin.event.keyCode == 110 ||
TheWin.event.keyCode == 13 ||
TheWin.event.keyCode == 46 ||
TheWin.event.keyCode == 8 ||
TheWin.event.keyCode == 9 ||
TheWin.event.keyCode == 190)
{
TheWin.event.returnValue=true;
}
else
{
//alert(TheWin.event.keyCode);
TheWin.event.returnValue=false;
}
}
function semak(ini,jenis)
{
//alert();
if(jenis == 1)
{
if(ini.value == "0")
{ ini.value = ""; }
else
{ return true; }
}
if(jenis == 2)
{
if(ini.value == "")
{ ini.value = "0"; }
else
{ return true; }
}
}
</script>
</head>
<body>
<form name="rm" method="post" action="proses_ringgit_malaysia.php">
RM <input name="nilai_ringgit" type="text" dir="rtl" value="0" size="10" maxlength="6" onKeyDown="nombor(self);" onFocus="semak(this,1);" onBlur="semak(this,2);">
<strong> . </strong>
<input name="nilai_sen" type="text" dir="rtl" value="0" size="5" maxlength="2" onFocus="semak(this,1);" onBlur="semak(this,2);">
<input type="submit" name="submit" value="Submit">
<input type="reset" name="Reset" value="Reset">
<br>Tidak melebihi RM 999,999.99
</form>
</body>
</html>
proses_ringgit_malaysia.php
// ambil nilai dari submit
$nilai_ringgit = trim($_POST['nilai_ringgit']);
$nilai_sen = trim($_POST['nilai_sen']);
if($nilai_ringgit == "" || $nilai_ringgit == NULL) { $nilai_ringgit = 0; }
if($nilai_sen == "" || $nilai_sen == NULL) { $nilai_sen = 0; }
$nilai = $nilai_ringgit.".".$nilai_sen;
?>
<?php
// umpukkan nilai yang akan diproses
$nilai = $nilai;
// isytihar nilai kepada format ringgit malaysia
$nilai_array = array();
$nilai_array[1] = sprintf("%01.2f", $nilai); // 1234.00
$nilai_array[2] = number_format($nilai_array[1], 2); // 1,234.00
$panjang_nilai_array = strlen($nilai_array[2]);
// tukar dan umpuk nilai ringgit (nombor) jadi perkataan
$ringgit_sahaja = substr($nilai_array[1], 0, strlen($nilai_array[1])-3);
$panjang_ringgit = strlen($ringgit_sahaja);
$ringgit_array = array();
for($i=0; $i<$panjang_ringgit; $i++)
{
$temp = substr($ringgit_sahaja, (0-1-$i), 1);
$ringgit_array[$i] = semakan_data_nilai($temp);
}
// tukar dan umpuk nilai sen (nombor) jadi perkataan
$sen_sahaja = substr($nilai_array[2], -2);
$panjang_sen = strlen($sen_sahaja);
$sen_array = array();
for($i=0; $i<2; $i++)
{
$temp = substr($sen_sahaja, $i, 1);
$sen_array[$i] = semakan_data_nilai($temp);
}
// baca nilai ringgit (data nombor)
$nombor_ringgit = array();
for($i=1; $i<=6; $i++)
{
$nombor_ringgit[$i] = substr($ringgit_sahaja, -$i, 1);
}
// terjemahkan data nilai ringgit @ semak dengan data nombor
$ayat_ringgit = array();
if($panjang_ringgit == 0) // #.00
{ $ayat_ringgit[1] = ""; }
if($panjang_ringgit >= 1) // 1.00
{
if($nombor_ringgit[1] == 0)
{ $ayat_ringgit[1] = ""; }
else
{ $ayat_ringgit[1] = "$ringgit_array[0]"; }
$ayat_ringgit_format = $ayat_ringgit[1];
}
if($panjang_ringgit >= 2) // 1#.00
{
if($nombor_ringgit[2] == 0)
{ $ayat_ringgit[2] = $ayat_ringgit[1]; }
elseif($nombor_ringgit[2] == 1 && $nombor_ringgit[1] == 0)
{ $ayat_ringgit[2] = "Sepuluh"; }
elseif($nombor_ringgit[2] == 1 && $nombor_ringgit[1] == 1)
{ $ayat_ringgit[2] = "Sebelas"; }
elseif($nombor_ringgit[2] == 1)
{ $ayat_ringgit[2] = "$ringgit_array[0] Belas"; }
elseif($nombor_ringgit[1] == 0)
{ $ayat_ringgit[2] = "$ringgit_array[1] Puluh"; }
else
{ $ayat_ringgit[2] = "$ringgit_array[1] Puluh $ringgit_array[0]"; }
$ayat_ringgit_format = $ayat_ringgit[2];
}
if($panjang_ringgit >= 3) // 1##.00
{
if($nombor_ringgit[3] == 0)
{ $ayat_ringgit[3] = $ayat_ringgit[2]; }
elseif($nombor_ringgit[3] == 1)
{ $ayat_ringgit[3] = "Seratus $ayat_ringgit[2]"; }
else
{ $ayat_ringgit[3] = "$ringgit_array[2] Ratus $ayat_ringgit[2]"; }
$ayat_ringgit_format = $ayat_ringgit[3];
}
if($panjang_ringgit >= 4) // 1###.00 @ 1,###.00
{
if($nombor_ringgit[4] == 0)
{ $ayat_ringgit[4] = $ayat_ringgit[3]; }
elseif($nombor_ringgit[4] == 1)
{ $ayat_ringgit[4] = "Seribu $ayat_ringgit[3]"; }
else
{ $ayat_ringgit[4] = "$ringgit_array[3] Ribu $ayat_ringgit[3]"; }
$ayat_ringgit_format = $ayat_ringgit[4];
}
if($panjang_ringgit >= 5) // 1####.00 @ 1#,###.00
{
if($nombor_ringgit[5] == 0)
{ $ayat_ringgit[5] = $ayat_ringgit[4]; }
elseif($nombor_ringgit[5] == 1 && $nom_temp4 == 0)
{ $ayat_ringgit[5] = "Sepuluh Ribu $ayat_ringgit[3]"; }
elseif($nombor_ringgit[5] == 1 && $nom_temp4 == 1)
{ $ayat_ringgit[5] = "Sebelas Ribu $ayat_ringgit[3]"; }
elseif($nombor_ringgit[5] == 1)
{ $ayat_ringgit[5] = "$ringgit_array[3] Belas Ribu $ayat_ringgit[3]"; }
elseif($nombor_ringgit[4] == 0)
{ $ayat_ringgit[5] = "$ringgit_array[4] Puluh Ribu $ayat_ringgit[3]"; }
else
{ $ayat_ringgit[5] = "$ringgit_array[4] Puluh $ringgit_array[3] Ribu $ayat_ringgit[3]"; }
$ayat_ringgit_format = $ayat_ringgit[5];
}
if($panjang_ringgit == 6) // 1#####.00 @ 1##,###.00
{
if($nombor_ringgit[6] == 1)
{ $ayat_ringgit[6] = "Seratus $ayat_ringgit[5]"; }
else
{ $ayat_ringgit[6] = "$ringgit_array[5] Ratus $ayat_ringgit[5]"; }
$ayat_ringgit_format = $ayat_ringgit[6];
}
// terjemahkan data nilai sen @ semak dengan data perkataan
if($sen_array[0] == "Kosong" && $sen_array[1] == "Kosong")
{ $ayat_sen = ""; }
elseif($sen_array[0] == "Satu" && $sen_array[1] != "Kosong")
{ $ayat_sen = "$sen_array[1] Belas Sen"; }
elseif($sen_array[0] != "Kosong" && $sen_array[1] != "Kosong")
{ $ayat_sen = "$sen_array[0] Puluh $sen_array[1] Sen"; }
elseif($sen_array[0] == "Kosong")
{ $ayat_sen = "$sen_array[1] Sen"; }
elseif($sen_array[1] == "Kosong" && $sen_array[0] == "Satu")
{ $ayat_sen = "Sepuluh Sen"; }
elseif($sen_array[1] == "Kosong" && $sen_array[0] != "Satu")
{ $ayat_sen = "$sen_array[0] Puluh Sen"; }
$ayat_sen_format = $ayat_sen;
// gabungkan nilai ringgit malaysia
if(($ayat_ringgit_format != "" || $ayat_ringgit_format != NULL) && ($ayat_sen_format != "" || $ayat_sen_format != NULL))
{ $ringgit_malaysia = "$ayat_ringgit_format Dan $ayat_sen_format Sahaja"; }
elseif(($ayat_ringgit_format != "" || $ayat_ringgit_format != NULL) && ($ayat_sen_format == "" || $ayat_sen_format == NULL))
{ $ringgit_malaysia = "$ayat_ringgit_format Sahaja"; }
elseif(($ayat_ringgit_format == "" || $ayat_ringgit_format == NULL) && ($ayat_sen_format != "" || $ayat_sen_format != NULL))
{ $ringgit_malaysia = "$ayat_sen_format Sahaja"; }
elseif(($ayat_ringgit_format == "" || $ayat_ringgit_format == NULL) && ($ayat_sen_format == "" || $ayat_sen_format == NULL))
{ $ringgit_malaysia = "Tiada"; }
print "RM = $nilai_array[2]<br>";
echo "<br><strong><font size=\"5\">Ringgit : <font color=\"#FF0000\">
$ringgit_malaysia</font></font></strong>";
function semakan_data_nilai($temp) // tukarkan data nombor kepada data perkataan
{
if($temp == ".")
{ $data = "Titik"; }
elseif($temp == 0)
{ $data = "Kosong"; }
elseif($temp == 1)
{ $data = "Satu"; }
elseif($temp == 2)
{ $data = "Dua"; }
elseif($temp == 3)
{ $data = "Tiga"; }
elseif($temp == 4)
{ $data = "Empat"; }
elseif($temp == 5)
{ $data = "Lima"; }
elseif($temp == 6)
{ $data = "Enam"; }
elseif($temp == 7)
{ $data = "Tujuh"; }
elseif($temp == 8)
{ $data = "Lapan"; }
elseif($temp == 9)
{ $data = "Sembilan"; }
return $data;
}
?>
Edited by Khairil Azhar, 22 June 2004 - 11:53 AM.
#9 Guest_aku_azhar_*
Posted 22 June 2004 - 11:55 AM
aku dah hadkan sampai RM 999,999.99 sahaja
kalau nak masuk input sejuta atau lebih, kene tambah koding la
thanks
#10
Posted 22 June 2004 - 12:46 PM
//masukkan baris di bawah ini jika anda ingin gunakan kod aturcara ini dalam aplikasi anda
// [ Number To Text Functions ][ author: adli@aftersyok.com ] [ 22/06/04 ]
//NOTE : BERFUNGSI BILA ADA NOMBOR DIBERI ADA KOMA SAHAJA. MEMERIKSA HINGGA RATUS JUTA SAHAJA
//nombor untuk ujian (statik)
$num = "12,103,238.56";
//papar nombor yang diuji
echo "Nombor : " .$num ."<br>";
//asingkan nombor dalam perpuluhan. num1(nombor sebelum perpuluhan), num2(nombor lepas perpuluhan)
$number = explode(".",$num);
$num1 = $number[0];
$num2 = $number[1];
//pisahkan bahagisan nombor pertama kepada array
$num1Pieces = explode(",",$num1);
$juta = "";
$ribu = "" ;
$ratus = "";
//SWICTH PERTAMA UNTUK PAPAR NILAI SEBELUM PERPULUHAN
switch ( count($num1Pieces) ){
//3 item dalam array terhasil jika nombor dalam juta
case 3:
$juta = stripEarlyZeroes($num1Pieces[0]);
if ( $juta != "0" ){
$juta = getHundred($juta) ." juta ";
}
$ribu = stripEarlyZeroes($num1Pieces[1]);
if ( $ribu != "0" ){
$ribu = getHundred($ribu) ." ribu ";
}
$ratus = stripEarlyZeroes($num1Pieces[2]);
if ( $ratus != "0" ){
$ratus = getHundred($ratus);
}
//papar hasil penukaran
echo $juta .$ribu .$ratus;
break;
case 2:
$ribu = stripEarlyZeroes($num1Pieces[0]);
if ( $ribu != "0" ){
$ribu = getHundred($ribu) ." ribu ";
}
$ratus = stripEarlyZeroes($num1Pieces[1]);
if ( $ratus != "0" ){
$ratus = getHundred($ratus);
}
//papar hasil penukaran
echo $ribu .$ratus;
break;
case 1:
$ratus = stripEarlyZeroes($num1Pieces[0]);
if ( $ratus != "0" ){
$ratus = getHundred($ratus);
}
//papar hasil penukaran
echo $ratus;
break;
}
//PAPAR NILAI UNTUK NOMBOR PERPULUHAN PULAK
$perpuluhan = stripEarlyZeroes($num2);
$perpuluhan = getHundred($perpuluhan);
//papar nilai
echo " dan " .$perpuluhan;
//#DEBUGGING FUNCTION CALL
//echo getHundred("0");
//toText(0);
//echo stripEarlyZeroes("000");
//#FUNGSI-FUNGSI PEMBANTU
//fungsi untuk buang nombor kosong yang muncul sebelum sebarang bukan-kosong
//001 will turn 1
//023 will turn 23
function stripEarlyZeroes($num){
//echo "yeye";
for ( $i=0;$i<strlen($num);$i++){
if ( (substr($num,0,1) == 0) || (substr($num,0,1) == "0" ) ) {
$num = substr($num,1,3);
}else{
return $num;
}
}
return $num;
}
//fungsi yang mengembalikan nombor ratus yang diberi kepada teks
//return text for up to 3 digit number. ( boleh di"optimizekan lagi". )
function getHundred($num){
//below is debug purpose
//echo "<br>nombor:" .$num ."<br>";
//initiate blank values
$ratus = "";
$puluh = "";
$sa = "";
//jika nombor 3 digit
if (strlen($num) == 3){
//tukarkan kepada teks
$ratus = toText( substr($num,0,1 ) );
$puluh = toText( substr($num,1,1) );
$sa = toText( substr($num,2,1) );
//khas untuk nombor belasan dan sepuluh
//number end checking
if ( $puluh == "satu" ){
if ( $sa == "satu" ){
return $ratus ." ratus " ."sebelas";
}
if ( $sa == "" ){
return $ratus ." ratus " ."sepuluh";
}
return $ratus ." ratus " .$sa ." belas" ;
}
//jika nombor pertengahan adalah kosong papar ratus dan sa jek
//zero middle number checking
if ( $puluh == "" ){
return $ratus ." ratus " .$sa;
}
return $ratus ." ratus " .$puluh ." puluh " .$sa;
}
if (strlen($num) == 2){
$puluh = toText( substr($num,0,1) );
$sa = toText( substr($num,1,1) );
//number end checking
if ( $puluh == "satu" ){
if ( $sa == "satu" ){
return "sebelas";
}
if ( $sa == "" ){
return "sepuluh";
}
return $sa ." belas" ;
}
return $puluh ." puluh " .$sa;
}
if (strlen($num) == 1){
$sa = toText( substr($num,0,1) );
return $sa;
}
}
//fungsi untuk penterjemahan terus nombor ke teks
//return teks of number supplied
function toText($num){
$teks = ",satu,dua,tiga,empat,lima,enam,tujuh,lapan,sembilan";
$teksArray = explode(",",$teks);
return $teksArray[$num];
}
?>
#11 Guest_aku_azhar_*
Posted 22 June 2004 - 01:07 PM
koding ko lagi kemas dan teratur la
cayalah
hidup php
thanks all
Edited by Khairil Azhar, 22 June 2004 - 01:07 PM.
#12
Posted 22 June 2004 - 01:12 PM
#13
Posted 22 June 2004 - 01:26 PM
#14 Guest_xpired_*
Posted 22 June 2004 - 02:15 PM
input.php
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<form name="form1" method="post" action="jawapan.php">
<input name="no" type="text" id="no">
<input type="submit" name="Submit" value="Submit">
</form>
</body>
</html>
jawapan.php
function text_number($nombor) {
$pecah = explode(".",number_format($nombor,2));
$ringgit = str_replace(",","",$pecah[0]);
$sen = $pecah[1][0] . $pecah[1][1];
echo number_format($nombor,2) . "<br>";
$check = $ringgit / 1000000;
$baki = $ringgit % 1000000;
if($check > 1) {
$ringgit = $ringgit - $baki;
$jumlah = $ringgit / 1000000;
$teks = number_teks($jumlah) . " Juta ";
}
$ratus_ribu_c = $baki / 1000;
$ratus_ribu = $baki % 1000;
if($ratus_ribu_c > 1) {
$genap = $baki - $ratus_ribu;
$jum = $genap / 1000;
//---------- Ratus Ribu ------------------
$jum1 = $jum / 100;
$jum2 = $jum % 100;
if($jum1 > 1) {
$jum1 = ($jum - $jum2 ) / 100;
$teks = $teks . number_teks($jum1) . " Ratus";
}
if($jum2 < 20) {
$teks = $teks . " " . number_teks($jum2);
} else {
$jum3 = $jum2 % 10;
$jum4 = ($jum2 - $jum3) / 10;
$teks = $teks . " " . number_teks($jum4) . " Puluh " . number_teks($jum3);
}
$teks = $teks . " Ribu ";
}
//------ Ratus Plak ---------------
$jum1 = $ratus_ribu / 100;
$jum2 = $ratus_ribu % 100;
if($jum1 > 1) {
$jum1 = ($ratus_ribu - $jum2 ) / 100;
$teks = $teks . number_teks($jum1) . " Ratus";
}
if($jum2 < 20) {
$teks = $teks . " " . number_teks($jum2);
} else {
$jum3 = $jum2 % 10;
$jum4 = ($jum2 - $jum3) / 10;
$teks = $teks . " " . number_teks($jum4) . " Puluh " . number_teks($jum3);
}
if($sen != 0) {
if($sen < 20) {
$sen_teks = number_teks($sen);
} else {
$sen_teks_1 = number_teks($sen[0]);
$sen_teks_2 = number_teks($sen[1]);
$sen_teks = $sen_teks_1 . " Puluh " . $sen_teks_2;
}
$teks = $teks . " Dan Sen " . $sen_teks . " Sahaja";
} else {
$teks = $teks . " Sahaja";
}
return $teks;
}
function number_teks($nombor) {
switch ($nombor) {
case 1 : return "Satu"; break;
case 2 : return "Dua"; break;
case 3 : return "Tiga"; break;
case 4 : return "Empat"; break;
case 5 : return "Lima"; break;
case 6 : return "Enam"; break;
case 7 : return "Tujuh"; break;
case 8 : return "Lapan"; break;
case 9 : return "Sembilan"; break;
case 10 : return "Sepuluh"; break;
case 11 : return "Sebelas"; break;
case 12 : return "Dua Belas"; break;
case 13 : return "Tiga Belas"; break;
case 14 : return "Empat Belas"; break;
case 15 : return "Lima Belas"; break;
case 16 : return "Enam Belas"; break;
case 17 : return "Tujuh Belas"; break;
case 18 : return "Lapan Belas"; break;
case 19 : return "Sembilan Belas"; break;
default : return "";
}
}
echo "Ringgit Malaysia " . text_number($no);
?>
Cubalah... had nombor 19999999.99 dan berasal dari no yang tiada koma....
selamat mencuba...
#15
Posted 22 June 2004 - 02:59 PM
#16 Guest_xpired_*
Posted 22 June 2004 - 03:04 PM
kalau nak rasanya korang boleh pikir camne nak buat... tapi pikir balik..... berguna ke tidak... kalau tak... baik abaikan jer...
#17
Posted 22 June 2004 - 03:12 PM
#18
Posted 23 June 2004 - 12:09 PM
error_reporting(E_ALL);
/**
* Dapatkan teks gandaan, fungsi pembantu
*
* | belas/ | | | | |
* sa | puluh | ratus | ribu | juta | billion | trillion
* --------------------------------------------------------
* 2^0 = 1 0000000000001 <= x | | | | | |
* 2^1 = 2 0000000000010 <= | x | | | | |
* 2^2 = 4 0000000000100 <= | | x | | | |
* 2^3 = 8 0000000001000 <= | | | x | | |
* 2^4 = 16 0000000010000 <= | x | | x | | |
* 2^5 = 32 0000000100000 <= | | x | x | | |
* 2^6 = 64 0000001000000 <= | | | | x | |
* 2^7 = 128 0000010000000 <= | x | | | x | |
* 2^8 = 256 0000100000000 <= | | x | | x | |
* 2^9 = 512 0001000000000 <= | | | | | x |
* 2^10 = 1024 0010000000000 <= | x | | | | x |
* 2^11 = 2048 0100000000000 <= | | x | | | x |
* 2^12 = 4086 1000000000000 <= | | | | | | x
* Di sini kita boleh buat 'mapping' menggunakan 'bitwise operation'.
*
* @param integer $ganda Input integer dari 0 hingga 12.
* @return mixed Perkataan gandaan (string) atau false jika operasi
* gagal.
* @access public
*/
function gandaan($ganda) {
/* Masukkan matriks diatas kedalam tatasusunan */
$gandaan = array(
'sa' => 1,
'puluh' => 2 | 16 | 128 | 1024,
'ratus' => 4 | 32 | 256 | 2048,
'ribu' => 8 | 16 | 32,
'juta' => 64 | 128 | 256,
'billion' => 512 | 1024 | 2048,
'trillion' => 4096
);
if (is_integer($ganda)) {
foreach ($gandaan as $key => $val) {
if (pow(2, $ganda) & $val) {
return $key;
}
}
}
return false;
}
/**
* Terjemah nombor kepada teks
*
* Teori:
* Mengenang kembali Bahasa Melayu dan Ilmu Hisab yang yang dipelajari semasa
* SRP atau SPM.
* - Struktur ayat (Bahasa Melayu):
* -> Nombor dari kosong sehingga sembilan: letak dalam array $nom
* -> Gandaan, contohnya puluh, ratus, ribu, puluh ribu, ratus ribu: dapat dari
* fungsi pembantu gandaan()
* -> Tetapi nombor 10 hingga 19 adalah unik sebab 10 ialah sepuluh dan yang
* lain ada perkataan belas - sebelas, dua belas dan sebagainya
*
* - Struktur nombor (Ilmu Hisab):
* -> Nombor 12345.67 boleh diuraikan kepada:
* (1*10^4)+(2*10^3)+(3*10^2)+(4*10^1)+(5*10^0)+(6*10^-1)+(7*10^-2)
*
* @param string $nombor Nombor yang hendak diterjemah kepada teks.
* Terima input string tetapi mesti nombor. Jika
* ada perpuluhan mesti 2 angka perpuluhan.
* @return mixed Teks yang diterjemah (string), atau false jika
* operasi gagal.
* @access public
*/
function nomborKeTeks($nombor) {
if (is_numeric($nombor) && preg_match("/^\d*(\.\d{2})?$/", $nombor)) {
$nom = array(
0 => "",
1 => "satu",
2 => "dua",
3 => "tiga",
4 => "empat",
5 => "lima",
6 => "enam",
7 => "tujuh",
8 => "lapan",
9 => "sembilan"
);
$nomarr = array();
$teks = '';
if (preg_match("/\./", $nombor)) {
$nomarr = explode('.', $nombor);
} else {
$nomarr[] = $nombor;
}
foreach ($nomarr as $key => $val) {
if ($key > 0) { $teks .= " dan"; }
$nombor = (int) $val;
$ganda = floor(log10($nombor));
if (is_finite($ganda) && ($tmp = gandaan((int) $ganda))) {
if ($tmp === 'sa') { $tmp = ''; }
$angka = (int) floor($nombor / pow(10, $ganda));
/* Proses khas untuk 10 - 19 */
if (($tmp === 'puluh') && ($angka === 1)) {
$nombor = (int) ($nombor - ($angka * pow(10, $ganda)));
$tmpganda = floor(log10($nombor));
if (($ganda - $tmpganda) > 1) { /* Untuk 10 */
$tmp = gandaan((int) $ganda - 1);
if ($tmp === 'sa') { $tmp = ''; }
$teks .= " sepuluh $tmp";
$angka = (int) floor($nombor / pow(10, $ganda));
} else { /* Untuk 11 -19 */
$ganda = &$tmpganda;
$angka = (int) floor($nombor / pow(10, $ganda));
$tmp = gandaan((int) $ganda);
if ($tmp === 'sa') { $tmp = ''; }
if ($angka === 1) {
$teks .= " sebelas $tmp";
} else {
$teks .= " {$nom[$angka]} belas $tmp";
}
}
// $teks = trim($teks);
$tmp = nomborKeTeks($nombor - ($angka * pow(10, $ganda)));
if ($tmp) {
if ($tmp === 'sa') { $tmp = ''; }
$teks .= " $tmp";
// $teks = trim($teks);
}
} else {
/* Nombor lain boleh diproses secara biasa */
$teks .= ($angka === 1) ? " se$tmp" : " {$nom[$angka]} $tmp";
// $teks = trim($teks);
$tmp = nomborKeTeks($nombor - ($angka * pow(10, $ganda)));
if ($tmp) {
$teks .= " $tmp";
// $teks = trim($teks);
}
}
}
}
/* Buang space dan " dan" di hujung ayat */
$pattern = array("/\ {2,}/", "/\ dan$/");
$replace = array(" ", "");
$teks = preg_replace($pattern, $replace, $teks);
return $teks;
} else {
return false;
}
}
/**
* Test
*/
/* Mari kita cuba fungsi diatas dengan pelbagai nombor */
$noyangdicuba = array('salah', '10000.00', '11909.23', '10456.23', '12345.67',
'12112312', '10003240', '34259.05', '83930', '51.3',
'843023');
foreach ($noyangdicuba as $key => $val) {
if ($jawapan = nomborKeTeks($val)) {
echo "$val => $jawapan\n";
} else {
echo "Nombor \"$val\" bukan nombor yang sah.\n";
}
}
?>
Output test:
10000.00 => sepuluh ribu
11909.23 => sebelas ribu sembilan ratus sembilan dan dua puluh tiga
10456.23 => sepuluh ribu empat ratus lima puluh enam dan dua puluh tiga
12345.67 => dua belas ribu tiga ratus empat puluh lima dan enam puluh tujuh
12112312 => dua belas juta seratus dua belas ribu tiga ratus dua belas
10003240 => sepuluh juta tiga ribu dua ratus empat puluh
34259.05 => tiga puluh empat ribu dua ratus lima puluh sembilan dan lima
83930 => lapan puluh tiga ribu sembilan ratus tiga puluh
Nombor "51.3" bukan nombor yang sah.
843023 => lapan ratus empat puluh tiga ribu dua puluh tiga
1 user(s) are reading this topic
0 members, 1 guests, 0 anonymous users











