はじめに
システム開発をしている中で、TrimStart('0')を使用した際に少しハマったので備忘録として残します。
今回発生したのは、2桁固定の数値文字列から先頭の0を削除してDB登録する処理での不具合です。
例えば、
- “01” → “1”
- “05” → “5”
- “10” → “10”
のように変換したかったため、TrimStart('0')を使用していました。
しかし、値が “00” の場合だけ想定外の結果になりました。
発生した問題
処理イメージは以下です。
string value = "00";
string result = value.TrimStart('0');
Console.WriteLine(result);
期待していた結果は、
0
でした。
しかし、実際の結果は、
つまり、空文字になってしまいます。
変換結果を整理すると以下になります。
| 変換前 | 期待値 | 実際の結果 |
|---|---|---|
| “01” | “1” | “1” |
| “10” | “10” | “10” |
| “00” | “0” | “” |
原因
原因は、TrimStart()の動きの理解不足でした。
TrimStart('0')は、
「先頭の0を1文字削除する」
という処理ではありません。
正しくは、
「指定した文字が先頭に続いている間、すべて削除する」
という処理になります。
そのため、
"00".TrimStart('0')
の場合、
1文字目の0を削除
↓
次の文字も0なので削除
↓
文字が残らない
という流れになり、結果は空文字になります。
対応方法
今回は、TrimStart()後に空文字だった場合だけ0を設定するようにしました。
string result = value.TrimStart('0');
if (result == "")
{
result = "0";
}
これで、
| 変換前 | 変換後 |
| “00” | “0” |
| “01” | “1” |
| “10” | “10” |
という想定通りの結果になります。
別の方法
今回のように「文字列」ではなく、純粋に「数値」として扱いたい場合は、数値変換する方法もあります。
string result = int.Parse(value).ToString();
結果は、
"00" → "0"
"01" → "1"
"10" → "10"
になります。
ただし、この方法の場合は、
- null
- 空文字
- 数値以外の文字
が入る可能性を考慮する必要があります。
状況によってはint.TryParse()などを使う方が安全です。
まとめ
TrimStart('0')を使用するときは、
「先頭の0を1つ消す」
ではなく、
「先頭にある0をすべて消す」
という動作になる点に注意が必要です。
特に、
- 固定桁のコード
- 外部システム連携データ
- DB登録前の変換処理
などでは、”00″のような値が来る可能性があります。
小さな処理ですが、意外と見落としやすいポイントでした。


コメント