【C#】TrimStart(‘0’)で「00」が空文字になる原因と対策【先頭0削除の注意点】

システムエンジニア

はじめに

システム開発をしている中で、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″のような値が来る可能性があります。

小さな処理ですが、意外と見落としやすいポイントでした。



コメント

タイトルとURLをコピーしました