最近有個格式化字串的需求,是要計算已知字串的 Byte 數量,每 100 個 Byte 加上一個換行符號(不能超過100)。一開始的想法是一個 char 一個 char 去跑迴圈並計算 Byte 數。不過這樣又似乎不太妥當,想來想去,最後寫成這個樣子:
public static string SetupType(string text) {
//先去除換行字元
text = text.Replace("\r", "").Replace("\n", "");
//每行最大 Byte 數
int bytesCountEachLine = 100;
//記錄目前已處理完成的字元數
int charIndex = 0;
//最後的回傳值
string result = string.Empty;
Encoding ansi = Encoding.Default;
byte[] textBytes = ansi.GetBytes(text);
while (charIndex < text.Length) {
//起始位置
int start = ansi.GetByteCount(text.Substring(0, charIndex)) ;
//利用 Encoding.GetCharCount 從起始位置將 100 個 Bytes 的字元一次取出
int count = 0;
if (textBytes.Length - start > bytesCountEachLine)
count = ansi.GetCharCount(textBytes, start, bytesCountEachLine);
else
count = ansi.GetCharCount(textBytes, start, textBytes.Length - start);
string target = text.Substring(charIndex, count);
//取出來的字串可能會大於 100 Bytes,所以需要把多餘的去掉
while (ansi.GetByteCount(target) > bytesCountEachLine) {
target = target.Substring(0, target.Length - 1);
count -= 1;
}
charIndex += count;
//最後一行不用加斷行符號
if (charIndex < text.Length)
result += target + "\r\n";
else
result += target;
}
return result;
}
用一段以前很愛看的小說片段來測試,結果如下:
測試前:
測試後:
全站熱搜
留言列表