(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]


本ブログの運営者kan.kikuchiが個人で開発したゲームです!


文字列の数字の所だけ等間隔にする【Unity】【TextMesh Pro】


このエントリーをはてなブックマークに追加


この記事でのバージョン
Unity 2022.3.32f1


はじめに

普通のフォントは文字ごとに幅が違うので、金額等を並べると

カンマの位置がズレてちょっと不格好な感じになってしまいます。


こういう時、TextMesh Proならmspaceを使えば一部分だけ幅を固定できるのですが、



ただ、カンマや円など全ての文字が変わってしまうので、一括には設定できません。


つまり数字部分だけタグで囲いたいので、↓のようにしたいわけです。

"<mspace=0.55em>12</mspace>,<mspace=0.55em>345</mspace>円"


今回はこれを簡単に行えるメソッドを作ってみました。


指定された文字列を数字の所だけ等間隔にする

さっそくですが、指定された文字列を数字の所だけ等間隔にするメソッドは以下の通りです。

一応、仕組みについても説明しておくと、

正規表現で「1桁以上の連続した数字列」を抽出し、それをタグで挟んでいる感じです。

/// <summary>
/// 指定された文字列を数字の所だけ等間隔にする
/// </summary>
public static string FormatNumbersWithSpacing(string text, float space = 0.55f) {
  return System.Text.RegularExpressions.Regex.Replace(text, @"(\d+)", $"<mspace={space}em>$1</mspace>");
}

/// <summary>
/// 指定された文字列を数字の所だけ等間隔にする(ref)
/// </summary>
public static void FormatNumbersWithSpacing(ref string text, float space = 0.55f) {
  text = System.Text.RegularExpressions.Regex.Replace(text, @"(\d+)", $"<mspace={space}em>$1</mspace>");
}


使い方は以下のように変換したい文字列を渡すだけ。

(上記のメソッドをTextUtilityというStaticクラスに実装している感じ)

string text = TextUtility.FormatNumbersWithSpacing("12,345円");

//refバージョン
//string text = "12,345円";
//TextUtility.FormatNumbersWithSpacing(ref text);