利用結構化的設計看待人民幣大寫轉換

2022-02-04 16:50:28 字數 3779 閱讀 3641

在網上看到不少人民幣大寫轉換的類,或多或少的總有一些問題,不放心用在企業開發上。而且每個人的思路總是天馬行空,別說物件導向的方法,就是面向過程也說不通,充斥著各種各樣的特殊情況。如果少考慮一種情況,那結果就很難預料,而且**的可讀性,我實在不敢恭維。

昨天,突然心血來潮,用結構化的思想整理了一遍,在這裡就拿出來分享一下。

首先,數字應該分段,分成萬以下的、萬、億、兆這幾個段,並且每個段的長度固定是4個數字。比如說 123456 分為兩個段,前面乙個未滿的段:12 ,後面是滿的段:3456 。

其次,每個滿段其實都是個十百千四個單位。比如:12345678 ,轉成數字大寫是:壹仟貳佰叄拾肆  萬  伍仟陸佰柒拾捌,發現什麼規律了嗎?

最後,就是處理一些必須有 0 的問題了,比如說:303 ,不能說:叄佰叄,應該是:叄佰零叄,這個「零」有很多講究的。

針對這些規律,我有針對性的整理出來兩個方法:singleconvert 、multiconvert 。其中 singleconvert 處理段內的邏輯,multiconvert 處理段間的邏輯,在段內的數字 0 問題穿插到 singleconvert 方法中,段間的數字 0 問題穿插到 multiconvert 方法中。另外,小數部分的處理,只有兩位數字,可以寫死,這個最簡單了。

說一下數字 0 的邏輯。

數字轉換出來應該是【叄仟零叄】,數字轉換出來應該是【叄佰零叄】,可以看到段內連續出現乙個或多個數字 0 的情況下,只會出現乙個漢字【零】。

數字轉換出來應該是【叄兆零叄佰】,數字轉換出來應該是【叄億零叄佰】,可以看到段間連續出現乙個或多個數字 0 的情況下,只會出現乙個漢字【零】。

所以,段內邏輯和段間邏輯,在連續出現多個【零】的時候,只保留乙個【零】。

數字轉換出來應該是【叄佰】,數字轉換出來應該是【叄仟】,可以看到在段內最後不管連續出現多少【零】,都抹掉不提。

所以,段內邏輯中,末尾的乙個或多個【零】,均不保留。

還有兩個不值得提的規律:每個數字對應乙個單位,必定是【個十百千】;每段對應乙個單位,從低到高的對應是【空、萬、億、兆、……】。

原諒我不知大更高的單位是什麼了,這輩子沒見過那麼多錢,神那~~

然後,然後就沒規律了,下面上**:

using system;
using system.collections.generic;
using system.diagnostics;
using system.linq;
using system.text;
namespace lenic.core
;
///
/// 位的分隔字元,從低到高依次是:仟、佰、拾、空
/// 

public

static

readonly

char defaultunitnumeric = new

char ;

///
/// 數字替換的字元,從低到高依次是:零、壹、貳、叄、肆、伍、陸、柒、捌、玖
/// 

public

static

readonly

char defaultcharnumeric = new

char ;

private

char charnumeric = defaultcharnumeric;

private

string rangenumeric = defaultrangenumeric;

private

char zeronumeric = defaultcharnumeric[0];

private

char unitnumeric = defaultunitnumeric;

#endregion
#region business methods
///
/// 重置數字替換的字元,必須從小到大是 10 個漢字字元。
/// 

/// 目標字元陣列

/// 成功替換則返回 true 。

public

bool resetcharnumeric(char data)

///
/// 重置位的分隔字元,必須從小到大是 4 個漢字字元。
/// 

/// 目標字元陣列

/// 成功替換則返回 true 。

public

bool resetunitnumeric(char data)

///
/// 重置段的分隔字元。
/// 

/// 目標字元陣列

public

void resetrangenumeric(string data)

///
/// 執行數字轉大寫漢字字元的操作。
/// 

/// 待轉換的數字

/// 轉換完成的大寫漢字字串。

public

string convert(decimal obj)

#endregion
#region private methods
private

string multiconvert(string data)

if (sbresult[sbresult.length - 1] == zeronumeric)
sbresult.remove(sbresult.length - 1, 1);
return sbresult.tostring();
}
private

string singleconvert(string data)

}
if (result.count != 1 && result.last() == zeronumeric)
result.removeat(result.count - 1);
return

newstring(result.toarray());

}
private

string decimalconvert(string data)

if (data[1] != '0')
return sbresult.tostring();
}
private ienumerable split(string data)
}
private

int chartoint(char obj)

#endregion
}
}

結構化設計

結構化設計,亦稱sd structured design 是一種面向資料流的設計方法,目的在於確定軟體的結構。1 結構化分析 是一種面向功能或面向資料流的需求分析方法,採用自頂向下 逐層分解的方法,建立系統的處理流程。程式流程圖 流程圖是對過程 演算法 流程的一種圖形表示,它對某個問題的定義 分析或...

關於結構化 半結構化 非結構化資料的理解

記得在課上,老師說,結構化資料就是我們關聯式資料庫裡的表,剩下的都是半結構化和非結構化資料,好比xml文件就是半結構化資料,word文件就是非結構化資料,大資料就是半結構化和非結構化資料。心中一直有乙個疑問?難道大資料不應該包含結構化資料嗎?實在學習資料庫這門課時,就對這幾個概念有所混淆,所幸今天在...

決策的結構化與半結構化

結構化 資料結構字段含義確定,清晰,典型的如資料庫中的表結構.半結構化 具有一定結構,但語義不夠確定,典型的如html網頁,有些欄位是確定的 title 有些不確定 table 非結構化 雜亂無章的資料,很難按照乙個概念去進行抽取,無規律性 結構化程度是指對某一決策問題的決策過程 決策環境和規律,能...