大写金额转换实现
| 需求分析 | 需求分析 |
|---|---|
| demo正文 | 博客鏈接 |
| 所使用的技術 | C#,winform, |
| 所使用的工具 | visual studio,ScreenToGif,HbuilderX |
1.參考文獻
-->大寫金額轉換規則<--
-->大寫金額轉換器<--
-->string類的Trim相關函數<--
2.解決思路
映射
1.先將0-9對應的大寫中文進行映射,方便后續的轉化,這里考慮用枚舉或者字典進行記錄,為了方便遍歷,我用了字典類型進行記錄。
標記
1.將要處理的字符串處理為四個一組,第一組沒單位,后面單位億和萬交替標記。同時增加一個flag,范圍0到-3,分別代表個拾佰仟
2.后續只需要根據每組當前的flag以及當前對應數字進行文字輸出
3.輸出完成文字后,標準答案被包含在了中文字符串中還得去除多余的零以及億單位后面的萬單位(因為億就已經包含了萬了)
3.成品展示
不輸入數據判空
輸入數據帶符號判錯(除了負號)
輸入數據帶英文判錯
負整數的轉換
負數帶小數的轉換
正整數的轉換
正數帶小數的轉換
4.需求分析
初審題目與計劃
首先對題目進行通讀,分析題目需求:
1.該輸入字符串只能是能正確表示的數字,不能帶有其余標點符號以及字母
2.大寫金額單位上到億,下到分
?3.輸入的數字不限大小,不一定是long long以內的數字,考慮用字符串進行處理
4.要提供一個按鈕用于轉換,以及一個輸入框進行輸入,還有一個顯示框進行顯示
5.語言選定C#
項目搭建
創建基于C#的winform桌面應用
界面大體模型
運行初始化
執行轉換按鈕。
執行出錯
5.設計實現過程
對輸入的數字串進行判斷
格式化輸入的字符串
對數字串(如果有小數位)進行四舍五入,保留兩位
轉換整數部分
轉換小數部分
合并字符串
6.代碼說明
字典初始化
先將之后用于數字->中文的映射記錄在一個字典中,winform界面初始化的時候同時進行字典的初始化,以免每次按鈕都要初始化一次增加開銷
字符串判斷
count變量用于記錄小數點的個數,如果有1個或者0個都是合法的,如果大于1個則return -1,表示輸入的數據違規
通過for循環遍歷字符串的每一個字符,如果出現不是數字以外的符號則直接返回違規數據
返回值-1代表錯誤,0和1代表小數點個數
格式化字符串
該函數用于處理合理輸入,但是邏輯不合理的數字串
調用trimstart函數將類似000000123這種前綴很多0的字符串進行格式化,把無效0全部過濾
對字符串進行四舍五入
該函數首先判斷格式化后的字符串有沒有小數點,若沒有則直接返回,不需要四舍五入,如果有小數點則根據位數進行判斷
若小數位數小于3,則無需四舍五入
若小數位數大于等于3,先保留前三位,之后根據第三位進行字符串的進位
由于string是final修飾符限定的
所以用一個char數組存儲字符串進行進位操作
將整數部分轉換為大寫金額
補0操作用于將字符串變為4的倍數,方便用于億和萬的標記
創建一個堆棧,用于存放億和萬的單位,一旦flag循環過一次,就從棧中彈出一個單位加入到輸出字符串
做好標記,設置好棧之后就可以進行循環遍歷輸入字符串,然后判斷后加入輸出字符串
該函數用于對輸出字符串進行優化,將多余的零以及億之后跟著的萬去除,從而得到標準答案
將小數部分轉換為小寫金額
該函數進行分類討論,0位,1位,2位的情況(因為已經四舍五入過了,不需要考慮后面的位數)
合并整數部分和小數部分
將上述兩個函數得到的整數部分以及小數部分進行合并
7.編碼過程遇到的困難
(char)int類型的使用
在判斷進位的時候,我用了一個int型變量記錄是否為10,如果為10則將當前字符變為0,并且進位標志置為1,不為10,則將該int型賦給當前字符,由于一開始以為可以直接轉
,導致輸出的字符串中帶了奇怪的標點符號,后來經過一番思索才知道應該要(char)(int+'0')這樣,才能轉換為對應的字符數字。
處理超長數字
一開始我想的是用數字除法進行一位一位的轉換成大寫金額,但后來才發現如果一旦輸入的數字串超出long long的范圍就會導致答案有問題,所以開始改成使用字符串進行操作。
超長數字讀法分歧
寫完程序之后,我通過網上的轉換器測試我自己寫的程序的準確性,發現億億級別內的數字讀法能夠和網上一模一樣,但是到了億億億級別之后,讀法開始出現了分歧,但是我自己寫在草稿紙上的讀法跟我程序寫出來的讀法一樣,所以到現在我還沒有解決三個億級別的數據讀法分歧的問題,不過實際應用中也用不到這么長的數字轉換就是了。
8.程序性能分析
時間復雜度
點擊按鈕后,不論是判斷,還是轉換的函數都是需要遍歷字符串的,因此該程序的時間復雜度為O(n)級別,后續可以繼續優化,看能否將時間復雜度進行進一步的優化。
空間復雜度
由于string類是由final修飾符修飾,一旦定義了就能不修改,因此需要一些輔助字符數組來進行字符串的修改操作,該程序還需要一個棧來存放標志位,因此空間開銷略大,空間復雜度略高,后續可以繼續進行優化。
9.心路歷程
心路歷程:
本次開發是基于C#以及winform進行開發,由于剛入手沒多久,學習興趣還是挺高的,winform的可拉動控件也讓我覺得非常的適合新手,字符串轉化為大寫金額的處理看似簡單,但是處理過程總會遇到一些磕磕碰碰,能夠自己親自模擬,以及找出解決辦法都對自我編碼能力的提高有著大大的幫助,通過這一次的編碼,我也是提高了不僅是對語言的使用,更是對于邏輯處理的能力。
技術收獲:
關于button_click和button.performclick:由于performclick是模擬用戶點擊,因此CPU要進行調度,若button1調用button2的performclick,則CPU會從button1的事件跳轉到button2進行執行,之后再調度回來,稍微影響性能。
總結
- 上一篇: 原创:好莱坞顶级男星被控性侵犯女助理!他
- 下一篇: 抖音上面离职251是什么意思 华为基本法