当前位置:  技术问答>java相关

非高手出马:数据与中文转换的问题!

    来源: 互联网  发布时间:2017-04-06

    本文导语:  问题是这样的:       在实际的财务账单中往往有这样的情况,有一项合计信息,是数字(double类型的).这也好说,可是往往还要把该数字转换成中文汉字大写.我感到真棘手!请高手们帮助我,给我提供一个方法! ...

问题是这样的:
      在实际的财务账单中往往有这样的情况,有一项合计信息,是数字(double类型的).这也好说,可是往往还要把该数字转换成中文汉字大写.我感到真棘手!请高手们帮助我,给我提供一个方法!

|
给你个vb写的源程序,思路是相同的:
Option Explicit
'总体思路:
'对数字进行分级处理,级长为4
'对分级后的每级分别处理,处理后得到字符串相连
'如:123456=12|3456
'第二级:12=壹拾贰 + “万”
'第一级:3456 =叁千肆百伍拾陆 + “”

Private Const PrvStrNum = "壹贰叁肆伍陆柒捌玖零"
Private Const PrvStrUnit = "万千百拾个"
Private Const PrvStrGradeUnit = "千万亿兆" '"兆亿万千"
Private Const PrvGrade = 4


Public Function getChangedVal(ByVal StrVal As String) As String
    Dim StrDotUnit As String
    Dim StrIntUnit As String
    
    
    StrDotUnit = getDotUnit(StrVal) '取小数位
    StrIntUnit = getIntUnit(StrVal) '取整数位
    
    StrIntUnit = getIntUpper(StrIntUnit) '整数位转换大写
    StrDotUnit = getDotUpper(StrIntUnit) '小数位转换大写
    
    getChangedVal = StrIntUnit & StrDotUnit
End Function

Private Function getDotUnit(ByVal StrVal As String) As String
    '得到小数点后的数字
    Dim StrRet As String
    Dim IntBegin As Integer
    Dim IntLen As Integer
    
    IntBegin = InStr(1, StrVal, ".") + 1
    IntLen = Len(StrVal) + 1
    StrRet = Mid(StrVal, IntBegin, IntLen - IntBegin)
    
    If IntBegin > 1 Then
        getDotUnit = StrRet
    End If
End Function
Private Function getIntUnit(ByVal StrVal As String) As String
    '得到整数数字
    Dim StrRet As String
    Dim IntBegin As Integer
    Dim IntLen As Integer
    
    '取得小数数位的长度
    IntBegin = Len(getDotUnit(StrVal))
    IntLen = Len(StrVal)
    
    StrRet = Mid(StrVal, 1, IntLen - IntBegin) '总字串长度-小数数位长度=整数数位长度
    
    If Mid(StrRet, Len(StrRet), 1) = "." Then '去除末位小数点
        StrRet = Mid(StrRet, 1, Len(StrRet) - 1)
    End If
    getIntUnit = StrRet
End Function

Private Function getIntUpper(ByVal StrVal As String) As String
    '得到转换后的大写(整数部分)
    Dim IntGrade As Integer '级次
    Dim StrRet As String
    Dim StrTmp As String
    
    '得到当前级次,
    IntGrade = Fix(Len(StrVal) / PrvGrade)
    '调整级次长度
    If (Len(StrVal) Mod PrvGrade)  0 Then
        IntGrade = IntGrade + 1
    End If
    
    'MsgBox Mid(PrvStrGradeUnit, IntGrade, 1)
    
    Dim i As Integer
    
    '对每级数字处理
    For i = IntGrade To 1 Step -1
        StrTmp = getNowGradeVal(StrVal, i) '取得当前级次数字
        StrRet = StrRet & getSubUnit(StrTmp) '转换大写
        StrRet = dropZero(StrRet) '除零
        '加级次单位
        If i > 1 Then '末位不加单位
            '单位不能相连续
            '??????????????????????????????????
            '
            
            StrRet = StrRet & Mid(PrvStrGradeUnit, i, 1)
        End If
        
    Next
    getIntUpper = StrRet
End Function

Private Function getDotUpper(ByVal StrVal As String) As String
    '得到转换后的大写(小数部分)
End Function
Private Function dropZero(ByVal StrVal As String) As String
    '去除连继的“零”
    Dim StrRet As String
    Dim StrBefore As String '前一位置字符
    Dim StrNow As String    '现在位置字符
    Dim i As Integer
    
    
    StrBefore = Mid(StrVal, 1, 1)
    StrRet = StrBefore
    
    For i = 2 To Len(StrVal)
        StrNow = Mid(StrVal, i, 1)
            
        If StrNow = "零" And StrBefore = "零" Then
            '同时为零
        Else
            StrRet = StrRet & StrNow
        End If
        StrBefore = StrNow
    Next
    
    '末位去零
    Dim IntLocate As Integer
    
    IntLocate = Len(StrRet)
    'IntLocate = IIf(IntLocate = 0, 1, IntLocate)
    
    If Mid(StrRet, IntLocate, 1) = "零" Then
        StrRet = Left(StrRet, Len(StrRet) - 1)
    End If
    dropZero = StrRet
End Function
Private Function getSubUnit(ByVal StrVal As String) As String
    '数值转换
    Debug.Print StrVal
    
    Dim IntLen As Integer
    Dim i As Integer
    Dim StrKey As String
    Dim StrRet As String
    Dim IntKey As Integer
    
    IntLen = Len(StrVal)
    
    For i = 1 To IntLen
        StrKey = Mid(StrVal, i, 1)
        IntKey = Val(StrKey)
        
        If IntKey = 0 Then
            '“零”作特殊处理
            If i  IntLen Then '转换后数末位不能为零
                StrRet = StrRet & "零"
            End If
        Else
            'If IntKey = 1 And i = 2 Then
                '“壹拾”作特殊处理
                '“壹拾”合理
            'Else
                StrRet = StrRet & Mid(PrvStrNum, Val(StrKey), 1)
            'End If
            '追加单位
            If i  IntLen Then '个位不加单位
                StrRet = StrRet & Mid(PrvStrUnit, Len(PrvStrUnit) - IntLen + i, 1)
            End If
        End If
    Next
    
    
    getSubUnit = StrRet
End Function
Private Function getNowGradeVal(ByVal StrVal As String, ByVal IntGrade As Integer) As String
    '得到当前级次的串
    Dim IntGradeLen As Integer
    Dim IntLen As Integer
    Dim StrRet As String
    
    IntGradeLen = IntGrade * PrvGrade
    IntLen = Len(StrVal)
    
    
    If IntLen >= IntGradeLen Then
        StrRet = Mid(StrVal, IntLen - IntGradeLen + 1, PrvGrade)
    Else
        StrRet = Mid(StrVal, 1, IntLen - (IntGrade - 1) * PrvGrade)
    End If
    'MsgBox StrRet
    getNowGradeVal = StrRet
    
End Function

|
自己写一个replace函数进行替换!
public String replace(String parentStr,String ch,String rep) { 
int i = parentStr.indexOf(ch); 
StringBuffer sb = new StringBuffer(); 
if (i == -1) 
return parentStr; 
sb.append(parentStr.substring(0,i) + rep); 
if (i+ch.length() 

    
 
 

您可能感兴趣的文章:

  • 请各大高手出马! shell问题(200分先送上 不够在加)
  • 请高手相助! 在MicroWindows中如何加入中文繁体字显示??
  • samba 3.0如何显示中文的问题,高手请进
  • 请高手相助! MicroWindows中如何加入中文繁体字显示
  • linux 下,doxygen生成的html文件中文注释为乱码,请高手指教!
  • 请教高手:中文问题
  • jsp中文乱码问题(有点特殊),高手进。。。
  • 关于数据显示 中文 乱码的害我许久的疑难杂症,各位JAVA高手近来看看!!
  • JSP中文乱码,高手请帮忙!!!
  • 从数据库中取出的数据用compareTo("中文")总没法得到想要的结果,请高手解答
  • 高手请进,最新中文问题!!request.getParameterValues();(在线)
  • 高手教我怎样才能取得一个字符串的“像素长度” 包括中文和英文大小写各种情况。
  • JDK1.4下使用WindowsLookFeel居然中文全部变成方框!请高手指点
  • 含有中文的文件处理(高手请进)
  • 我在linux下可以看到win2000下ntfs格式中的英文文件夹,可是却看不到中文的,还请高手帮忙.
  • 我的shell不支持中文注释,请高手帮忙
  • 高手请进:请问用response.sendRedirect()函数传递的中文参数如何正确识别?
  • *** 高分, 关于数据库中文乱码的问题, 请高手指教, 一定给分。 ****
  • 100分,请问高手,为何jdk1.3.1以后的demo中的stylepad不能存中文文件。
  • java的中文问题!! 请高手 传经!!
  • 请教高手(100分):关于B/S中的中文输入法问题。用微软的智能ABC在jTextArea老出错
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 如何将String转换为InputStream,如何将InputStream转换为String(高手请进)
  • 请问高手们,怎样把int 转换成String 型
  • 高手啊,请问如何将BufferedImage转换为可以用SOCKET传输的数据
  • 高手请进!请教java把TXT或XML或PDF格式的文档转换成word格式文档的问题
  • 现急需bmp文件转换成jpg文件的java源代码,请高手们帮帮忙,分数可再加。
  • 字符编码转换问题:高手请进!
  • 字符转换问题,高手请进,急救!!!!!!!!!!!
  • 在jbuilder6下如何存取中文数据库,内码的转换如何实现?高手请进,100分奉上
  • 请问各位高手Mon Sep 02 02:00:00 CST 2002 怎样转换成2002-9-2 2:00:00啊
  • 关于进制之间转换的算法问题,高手指点!
  • 我没有玩过linux,但现在有一个bat文件需要转换为sh文件,恳请各位高手帮忙!(在线等待)
  • 请高手帮我看一下,函数指针为何转换失败?
  • 十进制转换为二进制,sprintf函数怎么不好使呢,高手看看
  • 将域名转换为IP地址的小程序,整个程序运行完毕后出现段错误,请高手看看
  • 学习内核(赵博分析的那一版本)时,不理解empty_dir(namei.c中)指针转换,请高手指点
  • 高手请进:32位虚拟地址经过页机制转换以后得到的物理地址是32位吗?那物理内存又是怎样编址的呢?
  • 编码转换问题???高手请进!求救!!!万分感谢!
  • 高手,高手,高高手请进!
  • 有熟悉EXIM的高手高手么??
  • to 高手:学java应该怎样一步步学习,从菜鸟到高手.
  • 高分请高手,高手定能解决
  • 请问高手在linux中用什么命令可以做linux的启动盘???在等待高手??
  • 有高手研究Agent++麽?里面有个thread.h,蛮难读的,请高手指点
  • 难道高手区里的人就是高手?
  • 在dos下用bc31挑战高手******开发mssql程序,连接时报link err:undefined symbol GETNOTE in module DBEXTERN?(挑战高手)
  • 真正的linux高手,请看过来,看你符合高手标准不?
  • 难道这没有高手吗?难道这没有乐于助人的高手?(高分酬谢62+50+50)
  • 关于我对linux高手用yum,非高手用源码的理由
  • 高手救命,很急——ORACLE817安装在UNIXWARE711上,手工启动数据库后在netasst中连接错误,高手帮我看看?
  • 请教高手lvs的奇怪问题,我挺着急,希望高手别潜水,就就我,先谢谢了
  • 各个高手看看这个问题!本人第一次学习java所以要各位高手的帮助。。


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3