他システムと固定長ファイルで連携したり、帳票レイアウトのための位置調整など、「文字列を指定されたバイト数に成型する(かつ文字化けはさせない)」要件は意外と多いものです。
以下のエリアではFormFixedByteLengthLeftメソッドとFormFixedByteLengthRightメソッドを実際に動かした時の挙動を確認できます。
/// <summary>
/// 文字列を指定されたバイト長に左詰めで成型します
/// </summary>
/// <param name="target">対象の文字列</param>
/// <param name="lengthByte">バイト長</param>
/// <param name="padCharacter">パッドキャラクター</param>
/// <param name="isTruncateLeft">文字列を左側から切り詰める場合はtrue、それ以外はfalse</param>
/// <returns>指定されたバイト長に左詰めで成型された文字列</returns>
/// <remarks>成型された文字列の先頭・末尾に全角文字途中の要素が混入している場合は除去し、パッドキャラクターを追加します</remarks>
/// <remarks>Unicodeでバイト長に奇数が指定された場合などは、バイト長を超えない最大の長さで成型します</remarks>
public string FormFixedByteLengthLeft(string target, int lengthByte,
char padCharacter, bool isTruncateLeft)
{
// 部分文字列を取得
string partialString = isTruncateLeft ? TruncateByteLeft(target, lengthByte) :
TruncateByteRight(target, lengthByte);
// パッドするバイト長を取得
int padLengthByte = lengthByte - GetByteCount(partialString);
// パッドする必要がない場合
if (padLengthByte == 0)
{
return partialString;
}
// パッドする長さを取得
int padLength = padLengthByte / GetByteCount(padCharacter.ToString());
return partialString.PadRight(partialString.Length + padLength, padCharacter);
}
/// <summary>
/// 文字列を指定されたバイト長に左詰めで成型します
/// </summary>
/// <param name="target">対象の文字列</param>
/// <param name="lengthByte">バイト長</param>
/// <param name="padCharacter">パッドキャラクター</param>
/// <returns>指定されたバイト長に左詰めで成型された文字列</returns>
/// <remarks>成型された文字列の末尾に全角文字途中の要素が混入している場合は除去し、パッドキャラクターを追加します</remarks>
/// <remarks>Unicodeでバイト長に奇数が指定された場合などは、バイト長を超えない最大の長さで成型します</remarks>
public string FormFixedByteLengthLeft(string target, int lengthByte,
char padCharacter)
{
return FormFixedByteLengthLeft(target, lengthByte, padCharacter, true);
}
/// <summary>
/// 文字列を指定されたバイト長に左詰めで成型します
/// </summary>
/// <param name="target">対象の文字列</param>
/// <param name="lengthByte">バイト長</param>
/// <returns>指定されたバイト長に左詰めで成型された文字列</returns>
/// <remarks>成型された文字列の末尾に全角文字途中の要素が混入している場合は除去し、半角スペースを追加します</remarks>
/// <remarks>Unicodeでバイト長に奇数が指定された場合などは、バイト長を超えない最大の長さで成型します</remarks>
public string FormFixedByteLengthLeft(string target, int lengthByte)
{
return FormFixedByteLengthLeft(target, lengthByte, ’ ’);
}
/// <summary>
/// 文字列を指定されたバイト長に右詰めで成型します
/// </summary>
/// <param name="target">対象の文字列</param>
/// <param name="lengthByte">バイト長</param>
/// <param name="padCharacter">パッドキャラクタ</param>
/// <param name="isTruncateLeft">文字列を左側から切り詰める場合はtrue、それ以外はfalse</param>
/// <returns>指定されたバイト長に右詰めで成型された文字列</returns>
/// <remarks>成型された文字列の先頭・末尾に全角文字途中の要素が混入している場合は除去し、パッドキャラクターを追加します</remarks>
/// <remarks>Unicodeでバイト長に奇数が指定された場合などは、バイト長を超えない最大の長さで成型します</remarks>
public string FormFixedByteLengthRight(string target, int lengthByte,
char padCharacter, bool isTruncateLeft)
{
// 部分文字列を取得
string partialString = isTruncateLeft ? TruncateByteLeft(target, lengthByte) :
TruncateByteRight(target, lengthByte);
// パッドするバイト長を取得
int padLengthByte = lengthByte - GetByteCount(partialString);
// パッドする必要がない場合
if (padLengthByte == 0)
{
return partialString;
}
// パッドする長さを取得
int padLength = padLengthByte / GetByteCount(padCharacter.ToString());
return partialString.PadLeft(partialString.Length + padLength, padCharacter);
}
/// <summary>
/// 文字列を指定されたバイト長に右詰めで成型します
/// </summary>
/// <param name="target">対象の文字列</param>
/// <param name="lengthByte">バイト長</param>
/// <param name="padCharacter">パッドキャラクター</param>
/// <returns>指定されたバイト長に右詰めで成型された文字列</returns>
/// <remarks>成型された文字列の末尾に全角文字途中の要素が混入している場合は除去し、パッドキャラクターを追加します</remarks>
/// <remarks>Unicodeでバイト長に奇数が指定された場合などは、バイト長を超えない最大の長さで成型します</remarks>
public string FormFixedByteLengthRight(string target, int lengthByte,
char padCharacter)
{
return FormFixedByteLengthRight(target, lengthByte, padCharacter, true);
}
/// <summary>
/// 文字列を指定されたバイト長に右詰めで成型します
/// </summary>
/// <param name="target">対象の文字列</param>
/// <param name="lengthByte">バイト長</param>
/// <returns>指定されたバイト長に右詰めで成型された文字列</returns>
/// <remarks>成型された文字列の末尾に全角文字途中の要素が混入している場合は除去し、半角スペースを追加します</remarks>
/// <remarks>Unicodeでバイト長に奇数が指定された場合などは、バイト長を超えない最大の長さで成型します</remarks>
public string FormFixedByteLengthRight(string target, int lengthByte)
{
return FormFixedByteLengthRight(target, lengthByte, ’ ’);
}