在网上找到一个将数字转换为英文大写的类,,但是小数点后的转换是错的,例如:650.23 转换后是SIX HUNDRED AND FIFTY POINT TWO THREE
但正确应该是SIX HUNDRED AND FIFTY POINT TWENTY THREE请问如何修改?<?php
class TextNumber
{
var $resource = null;
var $number = 0;
var $groupLength = 3;
var $wordSeperated = true;
function setResource($resource = null){
$this->resource = $resource;
}
function setNumber($number){
$this->number = $number;
}
function setWordSeperated($seperated){
$this->wordSeperated = $seperated;
}
function split_number(&$sign, &$int, &$fraction){
list($int, $fraction) = explode('.', $this->number);
$sign = '';
if ($int{0} == '-'){
$sign = '-';
$int = substr($int, 1);
}
$int = preg_replace('/[^0-9]/', '', $int);
$int = preg_replace('/^[0]+/', '', $int);
$int = ($int == '')? '0' : $int;
$fraction = preg_replace('/[^0-9]/', '', $fraction);
if (preg_match('/^0*$/', $fraction))
$fraction = '';
} function split_group($int){
$int = strrev($int);
$int = chunk_split($int, $this->groupLength, ',');
$int = substr(strrev($int), 1);
return $int;
}
function addSeperator($word = ''){
if ($this->wordSeperated){
if ($word != '')
$word .= ' ';
}
return $word;
}
function trans_sign($sign){
if ($sign == '-'){
if (isset($this->resource['group']['-']))
return $this->addSeperator($this->resource['group']['-']);
else
return '-';
}else{
return '';
}
}
function trans_int($int){
return $this->split_group($int);
}
function trans_dec_point($fraction = 0){
if (isset($this->resource['group']['.'])){
$point = $this->resource['group']['.'];
$point = $this->addSeperator($point);
}else{
$point = '.';
}
return ($fraction == 0)? '' : $point;
}
function trans_fraction($fraction){
return ($fraction == 0)? '' : $fraction;
} function getText(){
$this->split_number($sign, $int, $fraction);
$ssign = $this->trans_sign($sign);
$sint = $this->trans_int($int);
$spoint = $this->trans_dec_point($fraction);
$sfrac = $this->trans_fraction($fraction);
return trim($ssign.$sint.$spoint.$sfrac);
}
} //--------------------------------------------------------------------------- class TextNumberFactory
{
function &createTextNumber($lang = 'en_US'){
$class = 'TextNumber_'.$lang;
if (class_exists($class)){
$textnumber =& new $class;
if (!is_subclass_of($textnumber, 'TextNumber')){
unset($textnumber);
$textnumber =& new TextNumber;
}
}else{
$textnumber =& new TextNumber;
}
return $textnumber;
}
} //--------------------------------------------------------------------------- class TextNumber_en_US extends TextNumber
{
function TextNumber_en_US(){
$this->__construct();
}
function __construct(){
$this->resource = array(
'group_int' => array(
0 => 'zero',
1 => 'one',
2 => 'two',
3 => 'three',
4 => 'four',
5 => 'five',
6 => 'six',
7 => 'seven',
8 => 'eight',
9 => 'nine',
10 => 'ten',
11 => 'eleven',
12 => 'twelve',
13 => 'thirteen',
14 => 'fourteen',
15 => 'fifteen',
16 => 'sixteen',
17 => 'seventeen',
18 => 'eighteen',
19 => 'nineteen',
20 => 'twenty',
30 => 'thirty',
40 => 'forty',
50 => 'fifty',
60 => 'sixty',
70 => 'seventy',
80 => 'eighty',
90 => 'ninety',
100 => 'hundred'
),
'group' => array(
0 => '',
1 => 'thousand',
2 => 'million',
3 => 'billion',
4 => 'trillion',
'-' => 'minus',
'.' => 'point',
'group_number' => 4
)
);
}
function trans_group_int($group_int){
$trans =& $this->resource['group_int'];
$h = intval(floor($group_int / 100));
$r = $group_int % 100;
$sh = '';
if ($h != 0){
$sh = $this->addSeperator($trans[$h]);
$sh .= $this->addSeperator($trans[100]);
}
$sr = '';
if ($r != 0){
if ($r <= 20){
$sr = $this->addSeperator($trans[$r]);
}else{
$rr = $r % 10;
$rt = $r - $rr;
if ($rr == 0){
$sr = $this->addSeperator($trans[$r]);
}else{
$sr = $trans[$rt];
$sr .= '-'.$this->addSeperator($trans[$rr]);
}
}
}
$ss = '';
if ($sh != '' && $sr != ''){
$ss = $sh. $this->addSeperator('and') .$sr;
}else{
$ss = $sh.$sr;
}
return $ss;
}
function trans_int($int){
if ($int <= 20) return $this->addSeperator($this->resource['group_int'][intval($int)]);
$groups = explode(',', $this->split_group($int));
$groups = array_reverse($groups);
$cgroup = $this->resource['group']['group_number'];
$result = '';
foreach($groups as $key => $group_int){
$sgroup = '';
$k = $key % $cgroup;
if ((int)$group_int != 0){
$sgroup = $this->resource['group'][$k];
$sgroup = $this->addSeperator($sgroup);
$sgroup = $this->trans_group_int($group_int).$sgroup;
}
$ss = '';
if ($k == 0 && $key >= $cgroup)
$ss = $this->addSeperator($this->resource['group'][$cgroup]);
$result = $sgroup.$ss.$result;
}
return $result;
}
function trans_fraction($fraction){
if ($fraction == '') return '';
$fraction = preg_replace('/([0-9])/e', '$this->addSeperator($this->resource[\'group_int\'][\\1])', $fraction);
return $fraction;
}
function getText($isupper = false){
$text = parent::getText();
if ($isupper){
$text = strtoupper($text);
}
return $text;
}
} ?>
但正确应该是SIX HUNDRED AND FIFTY POINT TWENTY THREE请问如何修改?<?php
class TextNumber
{
var $resource = null;
var $number = 0;
var $groupLength = 3;
var $wordSeperated = true;
function setResource($resource = null){
$this->resource = $resource;
}
function setNumber($number){
$this->number = $number;
}
function setWordSeperated($seperated){
$this->wordSeperated = $seperated;
}
function split_number(&$sign, &$int, &$fraction){
list($int, $fraction) = explode('.', $this->number);
$sign = '';
if ($int{0} == '-'){
$sign = '-';
$int = substr($int, 1);
}
$int = preg_replace('/[^0-9]/', '', $int);
$int = preg_replace('/^[0]+/', '', $int);
$int = ($int == '')? '0' : $int;
$fraction = preg_replace('/[^0-9]/', '', $fraction);
if (preg_match('/^0*$/', $fraction))
$fraction = '';
} function split_group($int){
$int = strrev($int);
$int = chunk_split($int, $this->groupLength, ',');
$int = substr(strrev($int), 1);
return $int;
}
function addSeperator($word = ''){
if ($this->wordSeperated){
if ($word != '')
$word .= ' ';
}
return $word;
}
function trans_sign($sign){
if ($sign == '-'){
if (isset($this->resource['group']['-']))
return $this->addSeperator($this->resource['group']['-']);
else
return '-';
}else{
return '';
}
}
function trans_int($int){
return $this->split_group($int);
}
function trans_dec_point($fraction = 0){
if (isset($this->resource['group']['.'])){
$point = $this->resource['group']['.'];
$point = $this->addSeperator($point);
}else{
$point = '.';
}
return ($fraction == 0)? '' : $point;
}
function trans_fraction($fraction){
return ($fraction == 0)? '' : $fraction;
} function getText(){
$this->split_number($sign, $int, $fraction);
$ssign = $this->trans_sign($sign);
$sint = $this->trans_int($int);
$spoint = $this->trans_dec_point($fraction);
$sfrac = $this->trans_fraction($fraction);
return trim($ssign.$sint.$spoint.$sfrac);
}
} //--------------------------------------------------------------------------- class TextNumberFactory
{
function &createTextNumber($lang = 'en_US'){
$class = 'TextNumber_'.$lang;
if (class_exists($class)){
$textnumber =& new $class;
if (!is_subclass_of($textnumber, 'TextNumber')){
unset($textnumber);
$textnumber =& new TextNumber;
}
}else{
$textnumber =& new TextNumber;
}
return $textnumber;
}
} //--------------------------------------------------------------------------- class TextNumber_en_US extends TextNumber
{
function TextNumber_en_US(){
$this->__construct();
}
function __construct(){
$this->resource = array(
'group_int' => array(
0 => 'zero',
1 => 'one',
2 => 'two',
3 => 'three',
4 => 'four',
5 => 'five',
6 => 'six',
7 => 'seven',
8 => 'eight',
9 => 'nine',
10 => 'ten',
11 => 'eleven',
12 => 'twelve',
13 => 'thirteen',
14 => 'fourteen',
15 => 'fifteen',
16 => 'sixteen',
17 => 'seventeen',
18 => 'eighteen',
19 => 'nineteen',
20 => 'twenty',
30 => 'thirty',
40 => 'forty',
50 => 'fifty',
60 => 'sixty',
70 => 'seventy',
80 => 'eighty',
90 => 'ninety',
100 => 'hundred'
),
'group' => array(
0 => '',
1 => 'thousand',
2 => 'million',
3 => 'billion',
4 => 'trillion',
'-' => 'minus',
'.' => 'point',
'group_number' => 4
)
);
}
function trans_group_int($group_int){
$trans =& $this->resource['group_int'];
$h = intval(floor($group_int / 100));
$r = $group_int % 100;
$sh = '';
if ($h != 0){
$sh = $this->addSeperator($trans[$h]);
$sh .= $this->addSeperator($trans[100]);
}
$sr = '';
if ($r != 0){
if ($r <= 20){
$sr = $this->addSeperator($trans[$r]);
}else{
$rr = $r % 10;
$rt = $r - $rr;
if ($rr == 0){
$sr = $this->addSeperator($trans[$r]);
}else{
$sr = $trans[$rt];
$sr .= '-'.$this->addSeperator($trans[$rr]);
}
}
}
$ss = '';
if ($sh != '' && $sr != ''){
$ss = $sh. $this->addSeperator('and') .$sr;
}else{
$ss = $sh.$sr;
}
return $ss;
}
function trans_int($int){
if ($int <= 20) return $this->addSeperator($this->resource['group_int'][intval($int)]);
$groups = explode(',', $this->split_group($int));
$groups = array_reverse($groups);
$cgroup = $this->resource['group']['group_number'];
$result = '';
foreach($groups as $key => $group_int){
$sgroup = '';
$k = $key % $cgroup;
if ((int)$group_int != 0){
$sgroup = $this->resource['group'][$k];
$sgroup = $this->addSeperator($sgroup);
$sgroup = $this->trans_group_int($group_int).$sgroup;
}
$ss = '';
if ($k == 0 && $key >= $cgroup)
$ss = $this->addSeperator($this->resource['group'][$cgroup]);
$result = $sgroup.$ss.$result;
}
return $result;
}
function trans_fraction($fraction){
if ($fraction == '') return '';
$fraction = preg_replace('/([0-9])/e', '$this->addSeperator($this->resource[\'group_int\'][\\1])', $fraction);
return $fraction;
}
function getText($isupper = false){
$text = parent::getText();
if ($isupper){
$text = strtoupper($text);
}
return $text;
}
} ?>
解决方案 »
- 请问PHP连接oracle8i,怎么配置
- Fatal error:call to undefined function mysql_connect?折腾了2天,怎么解决?
- 求高人帮忙写个正则表达式
- php 的json_decode函数怎么解决单引号啊
- php中的查询问题,问题是基础,可能比较简单需要经验
- 关于EXCEL导入导出有乱码问题,求解决_在线等
- 重装系统后,PHP无法连接MYSQL数据库
- 很急的问题.在线等.......
- 在用PHP和javaScirp做一个(下拉列表)多选择的程序,如何让一个文本框得到下拉列表的值呢?
- 在线用户程序如下:
- php中如何添加一个panel方法?
- 求教~~mysql的问题
$number = '650.23'; echo "$number<br><br>\n";
for($i = 0; $i < count($lang); $i++){
$textnumber =& TextNumberFactory::createTextNumber($lang[$i]);
$textnumber->setNumber($number);
$sNormal = $textnumber->getText(false);
$sUpper = $textnumber->getText(true);
echo "$sUpper<br><br>\n";
}
还是输出SIX HUNDRED AND FIFTY POINT TWO THREE