飞道的博客

1 2 3 转换成一百二十三,十万位以内的转换

426人阅读  评论(0)

python 解法


  
  1. # 将结尾的0 全部替换为# 比如 100 就是1## 但是 10100 则是101##
  2. def getNoEndZeroStr(originStr):
  3. noEndStr = originStr.rstrip( "0")
  4. # 确实有被替换的0
  5. hasEndZeroSize = len(originStr) - len(noEndStr)
  6. if (hasEndZeroSize > 0):
  7. return noEndStr + "#" * hasEndZeroSize
  8. return noEndStr
  9. pass
  10. def getNumberForStr(strNumber):
  11. if (strNumber == "" or strNumber == None):
  12. print( "数据不能为空")
  13. return
  14. # 不能转换为数字
  15. if not strNumber.isnumeric():
  16. print( "数据格式不正确")
  17. resByByFloat = 0;
  18. try:
  19. resByByFloat = float(strNumber)
  20. except Exception as ex:
  21. # 打印错误并且返回
  22. print( '输入的字符串不能转换位float ERROR: ' + str(ex))
  23. return
  24. if strNumber.__contains__( "."):
  25. print( "暂时不支持浮点运算")
  26. return
  27. if strNumber.__contains__( "-") or strNumber.__contains__( "——"):
  28. print( "暂时不支持负数运算")
  29. return
  30. dictByNumber = [ "零", "一", "二", "三", "四", "五", "六", "七", "八", "九"]
  31. dictByDigits = [ "", "十", "百", "千", "万"]
  32. # 针对0做特殊处理
  33. if resByByFloat == 0:
  34. return dictByNumber[ 0]
  35. # 开头如果为0的话 过滤掉
  36. noStratZeroStr = strNumber.lstrip( "0")
  37. # 将字符串转化为字符串数组
  38. strNumberList = list(noStratZeroStr)
  39. # 根据当前位数与字典位数对比
  40. if len(strNumberList) > len(dictByDigits):
  41. print( "数据太大了,暂时不支持")
  42. return
  43. # 根据数字大小截取正确的顺序
  44. dictByDigits = dictByDigits[ 0:len(strNumberList)]
  45. dictByDigits.reverse()
  46. # 过滤结尾的0 并用#字符串代替
  47. noEndZerostr = getNoEndZeroStr(noStratZeroStr)
  48. # 过滤中间的0 如果是两个0 就用1个0代替 10001 10**1
  49. hasOneCenter = noEndZerostr.replace( "0", "@")
  50. resStr = ""
  51. isAddCenterZero = False
  52. # 核心逻辑 倒叙添加最后反转字符串
  53. for index in range(len(strNumberList)):
  54. # 结尾是#号的代表 代表结尾是0 所以跳过
  55. if (noEndZerostr[index] == "#"):
  56. continue
  57. # 过滤中间的0
  58. if (hasOneCenter[index] == "@"):
  59. # 后续如果不是数字 符号不要
  60. if ( not isAddCenterZero):
  61. resStr += dictByNumber[int(strNumberList[index])]
  62. isAddCenterZero = True
  63. continue
  64. # 解决 10101
  65. if (index > 0 and hasOneCenter[index - 1] == "@" and hasOneCenter[index] != "@"):
  66. isAddCenterZero = False
  67. resStr += dictByNumber[int(strNumberList[index])] + dictByDigits[index]
  68. pass
  69. # 中间有连续多个零,只取一个零
  70. return resStr
  71. def printRes(strNumber):
  72. res = getNumberForStr(strNumber)
  73. print(strNumber + ":" + res)
  74. def main():
  75. for x in getContainsZeroAndOneNumber():
  76. printRes(str(x))
  77. pass
  78. # 拿到所有从0到9万9千中包含0和1的数字
  79. def getContainsZeroAndOneNumber():
  80. list=[]
  81. for x in range( 99999 + 1):
  82. strNumber = str(x)
  83. if not strNumber.replace( "0", "").replace( "1", ""):
  84. list.append(x)
  85. return list
  86. if __name__ == '__main__':
  87. main()

结果输出


  
  1. D: \devlop\python\python.exe D:/project/python/market/pic/main_number.py
  2. 0:
  3. 1:
  4. 10: 一十
  5. 11: 一十一
  6. 100: 一百
  7. 101: 一百零一
  8. 110: 一百一十
  9. 111: 一百一十一
  10. 1000: 一千
  11. 1001: 一千零一
  12. 1010: 一千零一十
  13. 1011: 一千零一十一
  14. 1100: 一千一百
  15. 1101: 一千一百零一
  16. 1110: 一千一百一十
  17. 1111: 一千一百一十一
  18. 10000: 一万
  19. 10001: 一万零一
  20. 10010: 一万零一十
  21. 10011: 一万零一十一
  22. 10100: 一万零一百
  23. 10101: 一万零一百零一
  24. 10110: 一万零一百一十
  25. 10111: 一万零一百一十一
  26. 11000: 一万一千
  27. 11001: 一万一千零一
  28. 11010: 一万一千零一十
  29. 11011: 一万一千零一十一
  30. 11100: 一万一千一百
  31. 11101: 一万一千一百零一
  32. 11110: 一万一千一百一十
  33. 11111: 一万一千一百一十一
  34. Process finished with exit code 0

 


转载:https://blog.csdn.net/mp624183768/article/details/111396038
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场