数字汉字转换-VB

– **********************************************FUNCTION NAME:
– CONVERT_MONEY

– DESCRIPTION:
– 将“阿拉伯数字”转换成“大写汉字”

– **********************************************

FUNCTION convert_money(input_nbr IN NUMBER DEFAULT 0) RETURN VARCHAR2 IS
    --
    num_character  VARCHAR2(100) := '零壹贰叁肆伍陆柒捌玖';
    unit_character VARCHAR2(300) := '分角圆拾佰仟万拾佰仟亿拾佰仟万拾佰仟亿';
    output_string  VARCHAR2(500) := '';
    remain_nbr     NUMBER(20);
    input_nbr_bak  NUMBER(30); -- 用于接收输入参数 INPUT_NBR
    bit_num        NUMBER(20); -- 每一位上的数字
    bit_unit       VARCHAR2(20); -- 每一位所对的单位
    bit_indic      NUMBER(3) := 0; -- 每一位的数字是否为0,0表示为0,1表示不为0
    i              NUMBER(2) := 0; -- 循环次数,索引变量从0开始
    spe_unit       VARCHAR2(30) := 'A'; -- 特殊位,包括万和亿,表示该亿汉字是否已写入结果字串
    sign_indic     VARCHAR2(1); -- 用于标志数值符号:0为正,1为负
    --
  BEGIN
    --
    IF input_nbr = 0 THEN
      RETURN '零圆整';
    ELSIF input_nbr > 0 THEN
      sign_indic    := '0';
      input_nbr_bak := input_nbr;
    ELSIF input_nbr < 0 THEN
      sign_indic    := '1';
      input_nbr_bak := -input_nbr;
    END IF;
    --
    LOOP
      --
      remain_nbr    := floor(input_nbr_bak / 10); -- 取出除后的商
      bit_num       := input_nbr_bak - remain_nbr * 10; -- 取出当前位的数值
      input_nbr_bak := remain_nbr; -- 保存商以做下一次循环
      bit_unit      := rtrim(substr(unit_character, i * 1 + 1, 1)); -- 取出当前位的单位汉字
      --
      IF bit_num > 0 THEN
        --
        bit_indic := 1;
        --
        IF i = 6 OR i = 14 THEN
          spe_unit := '万';
        ELSIF (i >= 7 AND i <= 9) OR (i >= 15 AND i <= 17) THEN
          --
          IF spe_unit != '万' THEN
            output_string := '万' || output_string;
            spe_unit      := '万';
          END IF;
          --
        END IF;
        --
        output_string := substr(num_character, bit_num * 1 + 1, 1) ||
                         bit_unit || output_string;
        --
      ELSE
        --
        IF bit_indic = 1 THEN
          output_string := '零' || output_string;
        END IF;
        --
        IF bit_unit IN ('圆', '亿') THEN
          spe_unit      := bit_unit;
          output_string := bit_unit || output_string;
        END IF;
        --
        bit_indic := 0;
        --
      END IF;
      --
      i := i + 1;
      --
      EXIT WHEN input_nbr_bak = 0;
      --
    END LOOP;
    --
    -- ****************************
    -- 输入的数字没有分,最小的是角,则尾部串个整
    -- ****************************
    IF MOD(input_nbr, 10) = 0 THEN
      output_string := output_string || '整';
    END IF;
    --
    IF sign_indic = '1' THEN
      output_string := '负' || output_string;
    END IF;
    --
    RETURN output_string;
    --
  END convert_money;

数字转换成中文汉字数字

public class Test2 {
 
 
    private static final String[] UNITS = { "", "十", "百", "千", "万", "十", "百", "千", "亿", "十", "百", "千", };
    private static final String[] NUMS = { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九", };
 
    /** 
     *  数字转换成中文汉字 
     *  @param value 要转换的数字 
     *  @return 返回数字转后的汉字字符串 
     */
    public static String number2Chinese(int value) {
 
        String result = ""; //转译结果 
 
        for (int i = String.valueOf(value).length() - 1; i >= 0; i--) {//String.valueOf(value) 转换成String型得到其长度 并排除个位,因为个位不需要单位
            int r = (int) (value / Math.pow(10, i));//value / Math.pow(10, i) 截位匹配单位 
            result += NUMS[r % 10] + UNITS[i];
        }
 
        result = result.replaceAll("零[十, 百, 千]", "零");//匹配字符串中的 "零[十, 百, 千]" 替换为 "零"
        result = result.replaceAll("零+", "零");//匹配字符串中的1或多个 "零" 替换为 "零"
        result = result.replaceAll("零([万, 亿])", "$1");
        result = result.replaceAll("亿万", "亿"); //亿万位拼接时发生的特殊情况
 
        if (result.startsWith("一十")) { //判断是否以 "一十" 开头 如果是截取第一个字符
            result = result.substring(1);
        }
 
        if (result.endsWith("零")) { //判断是否以 "零" 结尾 如果是截取除 "零" 外的字符
            result = result.substring(0, result.length() - 1);
        }
 
        return result;
    }
 
    public static void main(String[] args) {
        System.out.println(Test2.number2Chinese(2139567804));
    }
 
 
 
 
}
    private static final String[] UNITS = { "", "十", "百", "千", "万", "十", "百", "千", "亿", "十", "百", "千", };
    private static final String[] NUMS = { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九", };
 
    /** 
     *  数字转换成中文汉字 
     *  @param value 要转换的数字 
     *  @return 返回数字转后的汉字字符串 
     */
    public static String number2Chinese(int value) {
 
        String result = ""; //转译结果 
 
        for (int i = String.valueOf(value).length() - 1; i >= 0; i--) {//String.valueOf(value) 转换成String型得到其长度 并排除个位,因为个位不需要单位
            int r = (int) (value / Math.pow(10, i));//value / Math.pow(10, i) 截位匹配单位 
            result += NUMS[r % 10] + UNITS[i];
        }
 
        result = result.replaceAll("零[十, 百, 千]", "零");//匹配字符串中的 "零[十, 百, 千]" 替换为 "零"
        result = result.replaceAll("零+", "零");//匹配字符串中的1或多个 "零" 替换为 "零"
        result = result.replaceAll("零([万, 亿])", "$1");
        result = result.replaceAll("亿万", "亿"); //亿万位拼接时发生的特殊情况
 
        if (result.startsWith("一十")) { //判断是否以 "一十" 开头 如果是截取第一个字符
            result = result.substring(1);
        }
 
        if (result.endsWith("零")) { //判断是否以 "零" 结尾 如果是截取除 "零" 外的字符
            result = result.substring(0, result.length() - 1);
        }
 
        return result;
    }
 
    public static void main(String[] args) {
        System.out.println(Test2.number2Chinese(2139567804));
    }




}

 

文本中所有汉字数字转阿拉伯数字-VB

Option Explicit
 
Function CNum(ByVal CdataStr As String) As String
Dim i As Integer, Idx As Integer, Idc As Integer
Dim tmp As String, sTmp As String, cTmp As String, aTmp As String
Dim Char, CharUnit, Num
Dim rmbFormat As String
Dim NumLong As Long
Dim NumTmp As Long, NumTmpA As Long, NumTmpB As Long
 
On Error GoTo errexit
 
'别字列表
Char = Array( "", "", "", "", "", "", "", "", "", "", "", "")
'标准字列表
CharUnit = Array("", "", "", "", "", "", "", "", "", "", "", "", "", "", "亿")
'中文数位列表
Num = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
 
rmbFormat = "拾佰仟万拾佰仟亿"
 
'统一大写标准
For i = 0 To UBound(Char)
CdataStr = Replace(CdataStr, Char(i), CharUnit(i))
Next
 
'数字转换为阿拉伯数字
For i = 0 To UBound(Num)
CdataStr = Replace(CdataStr, CharUnit(i), Num(i))
Next
 
For i = 1 To Len(CdataStr)
tmp = Mid(CdataStr, i, 1)
 
If IsNumeric(tmp) Then '数字处理
    NumTmp = Val(tmp)
    If NumTmp = 0 Then '遇0位数处理
        Idx = Idx - 1
    End If
    If i = Len(CdataStr) Then ' 数字结束处理
        NumLong = NumLong + NumTmpB + NumTmp
        cTmp = CStr(NumLong)
        NumLong = 0
        NumTmpB = 0
        NumTmp = 0
    End If
Else '汉字处理
    Idx = InStr(rmbFormat, tmp) '位数读取
    If Idx > 0 Then '大写汉字处理
        If Idx <= 3 Then '千位数处理
            If NumTmp > 0 Then '拾 佰 千 非空字头
                NumTmpB = NumTmpB + NumTmp * 10 ^ Idx
                NumTmp = 0
                Idx = Idx - 1
            Else
                If NumTmpB > 0 Then '拾 百 千 空字头 前有数字前缀 显示汉字 如:6百千=600千
                    cTmp = CStr(NumTmpB) & tmp
                Else
                    If Idx = 1 Then '无数字前缀 拾 空字头 只限:拾=10
                        NumTmp = 1
                        NumTmpB = NumTmp * 10 ^ Idx
                        NumTmp = 0
                        Idx = Idx - 1
                    Else '无数字前缀空字 如:“百”=“百”
                        cTmp = tmp
                    End If
                End If
            End If
        ElseIf Idx = 0 Or Idx = 4 Or Idx = 8 Then ' 万 亿 位数分段计算,保留空位数(IDX=0)计算
            If NumTmp > 0 Or NumTmpB > 0 Then '只计算第一次出现,下一次作为后缀(如:10万万只计算第一个“万”,第二个“万”作为后缀处理)
                NumLong = NumLong + (NumTmpB + NumTmp) * 10 ^ Idx '保留此位数据,垒入之后的数字
                NumTmpB = 0
                NumTmp = 0
            ElseIf NumLong > 0 Then '汉字后缀表示处理,如:10万万只计算第一个“万”,第二个“万”作为后缀处理
                cTmp = CStr(NumLong) & tmp
                NumLong = 0
            End If
            Idc = Idx - 1
        ElseIf NumLong = 0 And NumTmp = 0 And NumTmpB > 0 Then '百 拾 后缀处理
                cTmp = CStr(NumTmpB) & tmp
                NumTmpB = 0
        Else
            cTmp = tmp  '大于“亿”汉字数字及 非大写数字——字符处理 直接显示 如:100兆=100兆
            Idc = 0
        End If
    Else '其它汉字或字符处理
        If NumLong > 0 Or NumTmp > 0 Or NumTmpB > 0 Then '计算汉字部分数值 合并
            NumLong = NumLong + (NumTmpB + NumTmp) * 10 ^ Idx
            cTmp = CStr(NumLong)
            NumLong = 0
            NumTmp = 0
            NumTmpB = 0
        End If
         
        cTmp = cTmp & tmp
    End If
 
    If i = Len(CdataStr) And cTmp = "" Then  '结束转换处理 如:10千=100000 10万=1000000 结束内部计算 结束计算输出计算结果
        If NumLong > 0 Or NumTmpB > 0 Or NumTmp > 0 Then
            NumLong = NumLong + (NumTmpB + NumTmp) * 10 ^ Idx
            cTmp = CStr(NumLong)
            NumTmp = 0
            NumLong = 0
            NumTmpB = 0
        Else '无内部数字计算结果处理
            cTmp = tmp
        End If
    End If
End If
 
 
If cTmp <> "" Then  '转换数据、汉字、字符串接
    sTmp = sTmp & cTmp
    cTmp = ""
End If
 
Next i
 
'转换成功,输出数据
CNum = sTmp
Exit Function
 
'转换失败,输出空
errexit:
CNum = ""
End Function
 
Private Sub Form_Load()
Debug.Print CNum("")
Debug.Print CNum("")
Debug.Print CNum("五佰十")
Debug.Print CNum("金额:拾亿零叁百05万零捌元六角,拾2万万人口")
Debug.Print CNum("陆仟壹佰叁拾捌元五角一分")
Debug.Print CNum("一万零叁拾陆")
 
Debug.Print CNum("天天五亿元")
Debug.Print CNum("我要拾元")
End Sub


结果:
10

500拾
金额:1003050008元6角,120000万人口
6138元5角1分
10036
天天500000000元
我要10元