Board logo

标题: [原创代码] powershell 中文数字转阿拉伯数字 [打印本页]

作者: newswan    时间: 2021-6-15 12:58     标题: powershell 中文数字转阿拉伯数字

本帖最后由 newswan 于 2021-6-18 19:35 编辑

中文数字转阿拉伯数字,只支持整数,可以继续添加 小数 负数 大写
  1. function hz_num ()
  2. {
  3. $a = [ordered] @{"零"=0; "一"=1; "二"=2; "三"=3; "四"=4; "五"=5; "六"=6; "七"=7; "八"=8; "九"=9}
  4. $b = [ordered] @{"十"=10; "百"=100; "千"=1000}
  5. $c = [ordered] @{"万"=10000}
  6. $d = [ordered] @{"亿"=100000000}
  7. $str = $args[0] -replace "(?<=^|[^一二三四五六七八九])十","一十"
  8. $x = $str -split ""
  9. [long[]] $ss = @(0) * 3
  10. $i = 0
  11. while ($i -le $x.count)
  12. {
  13.     $i++
  14.     $s = $x[$i]
  15.     if ($a.keys -contains $s)
  16.     {
  17.         $ss[0] = $ss[0] * 10 + $a[$s]
  18.     } elseif ($b.keys -contains $s)
  19.     {
  20.         $ss[1] += $ss[0] * $b[$s]
  21.         $ss[0] = 0
  22.     } elseif ($c.keys -contains $s)
  23.     {
  24.         $ss[1] = ($ss[1] + $ss[0]) * $c[$s]
  25.         $ss[0] = 0
  26.     } elseif ($d.keys -contains $s)
  27.     {
  28.         $ss[2] = ($ss[2] + $ss[1] + $ss[0]) * $d[$s]
  29.         $ss[1] = 0
  30.         $ss[0] = 0
  31.     } elseif ($s -eq "")
  32.     {
  33.         $ss[2] = $ss[2] + $ss[1] + $ss[0]
  34.         $ss[1] = 0
  35.         $ss[0] = 0
  36.     }
  37. }
  38. return $ss[2]
  39. }
  40. hz_num  "一万一千零一亿零二十万三百三十三"
复制代码

作者: newswan    时间: 2021-6-17 13:03

本帖最后由 newswan 于 2021-6-18 19:33 编辑

改进 支持 小数 大写 金额
  1. $dn = [ordered] @{
  2.     "零"=0; "一"=1; "二"=2; "三"=3; "四"=4; "五"=5; "六"=6; "七"=7; "八"=8; "九"=9;
  3.     "〇"=0; "壹"=1; "贰"=2; "叁"=3; "肆"=4; "伍"=5; "陆"=6; "柒"=7; "捌"=8; "玖"=9;
  4.     "拾"="十"; "佰"="百"; "仟"="千"; "两"=2; "廿"="2十";
  5. }
  6. $dr = [ordered] @{
  7.     "0"=0; "1"=1; "2"=2; "3"=3; "4"=4; "5"=5; "6"=6; "7"=7; "8"=8; "9"=9;
  8.     "十"=10; "百"=100; "千"=1000; "拾"=10; "佰"=100; "仟"=1000;
  9.     "万"=10000;
  10.     "亿"=100000000;
  11.     "兆"=10000000000000000;
  12. }
  13. $rank = [ordered] @{
  14.     "0"=0; "1"=0; "2"=0; "3"=0; "4"=0; "5"=0; "6"=0; "7"=0; "8"=0; "9"=0;
  15.     "10"=1; "100"=1; "1000"=1;
  16.     "10000"=2;
  17.     "100000000"=3;
  18.     "10000000000000000"=4;
  19. }
  20. function convert_zwzs ($str)
  21. {
  22.     #ss  [0] 数字  [2~n] 单位
  23.     [long[]] $ss = @(0) * 5
  24.     $i = 0
  25.     $str.GetEnumerator() | foreach {
  26.         $i++
  27.         $v = [long] $dr[$_.ToString()]
  28.         $r = $rank[[string]$v]
  29.         write-Debug  ('{0,2} {1,4} {2,4} {3,-8} {4,-6} {5}' -f $i , "b:" , "s:$s" , "v:$v" , "r:$r" , "ss: $ss" )
  30.         if ($r -eq 0)
  31.         {
  32.             $ss[0] = $ss[0] * 10 + $v
  33.         }
  34.         elseif ( $r -eq 1)
  35.         {
  36.             $ss[1] += $ss[0] * $v
  37.             $ss[0] = 0
  38.         }
  39.         elseif ( $r -ge 2)
  40.         {
  41.             for($m = 0 ; $m -le $r - 1 ; $m++)
  42.             {
  43.                 $ss[$r] += $ss[$m]
  44.                 $ss[$m] = 0
  45.             }
  46.             $ss[$r] *= $v
  47.         }
  48.         write-Debug  ('{0,2} {1,4} {2,4} {3,-8} {4,-6} {5}' -f $i , "e:" , "s:$s" , "v:$v" , "r:$r" , "ss: $ss" )
  49.     }
  50.    
  51.     if($str -match "([百千拾佰仟万亿兆]+)(\d+)$") # 末尾数字无单位
  52.     {
  53.         # $m1 = $matches
  54.         $v = 1
  55.         $matches[1].GetEnumerator() | foreach-object {
  56.             $v *= [long] $dr[[string]$_]
  57.         }
  58.         if ($matches[2] -match "^([1-9]*)0*([0-9]*)$")
  59.         {
  60.             $ss[0] = ([int] $matches[1]) * $v / [math]::pow(10,$matches[1].length) + ([int] $matches[2])
  61.         }
  62.     }
  63.    
  64.     $n=$ss.GetUpperBound(0)
  65.     for($m = 0 ; $m -le $n - 1 ; $m++)
  66.     {
  67.         $ss[$n] += $ss[$m]
  68.         $ss[$m] = 0
  69.     }
  70.    
  71.     return $ss[-1]
  72. }
  73. # 主函数
  74. function convert_zw_num ($str)
  75. {
  76.     $str = $str -replace "\s+",""
  77.     if ($str -match "^[-负]")
  78.     {
  79.         $numSgn = "-"
  80.         $str = $str -replace "^[-负]",""
  81.     }
  82.     $dn.GetEnumerator() | ForEach-Object {
  83.         $str = $str -replace $_.key , $_.value
  84.     }
  85.     $str = $str -replace "[元圆正整点.]+","."
  86.     $str = $str -replace "[.]$",""
  87.     $str = $str -replace "^[.]","0."
  88.     $str = $str -replace "(?<=^|[^1-9])(?=[十])","1"
  89.    
  90.     if ($str -match "^[\d.]+$") # 纯数字
  91.     {
  92.         [string] $num = $str
  93.     }
  94.     elseif ($str -match "(\d+[.]\d+)([仟万亿兆]+)$") # 数字 + 单位
  95.     {
  96.         [double] $num1 = $matches[1]
  97.         $matches[2].GetEnumerator() | foreach-object {
  98.             $num1 *= [long] $dr[ [string]$_ ]
  99.         }
  100.         [string] $num = $num1
  101.     }
  102.     elseif ($str -notmatch "([.])") # 中文整数
  103.     {
  104.         [string] $num = convert_zwzs $str
  105.     }
  106.     elseif ($str -match "(.*)[.](\d+)$") # 中文整数.小数
  107.     {
  108.         [string] $num1 = convert_zwzs $matches[1]
  109.         [string] $num2 = $matches[2]
  110.         [string] $num = $num1 + "." + $num2
  111.     }
  112.     elseif ($str -match "[角分]+")  # 中文金额
  113.     {
  114.         if ($str -match "([^.角分]*)[.]*(\d+角)*(\d+分)*$")
  115.         {
  116.             [string] $num1 = convert_zwzs $matches[1]
  117.             $num2 = [double] ( $matches[2] -replace "角","" ) /10
  118.             $num2 += [double] ( $matches[3] -replace "分","" ) /100
  119.             [string] $num = [double] $num1 + $num2
  120.         }
  121.     }
  122.    
  123.     return $numSgn + [string] $num
  124. }
  125. convert_zw_num "壹拾壹元壹角壹分"
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2