/// <summary> /// 整数部要素の読み仮名を決定する。 /// </summary> /// <param name="type">対象種別。</param> /// <param name="prevType">先行要素の種別。</param> /// <param name="nextType">後続要素の種別。</param> /// <returns>読み仮名。</returns> private static string DecideNumberKana( NumberPhoneType type, NumberPhoneType prevType, NumberPhoneType nextType) { if (!type.IsDefined()) { return string.Empty; } return NumberKanaDeciders[(int)type](type, prevType, nextType); }
/// <summary> /// 4桁単位での読み仮名をバッファに追加する。 /// </summary> /// <param name="src">数字列。1~4文字。</param> /// <param name="prevType">先行要素の種別。</param> /// <param name="baseType">4桁単位要素の種別。</param> /// <param name="dest">追加先の文字列バッファ。</param> /// <param name="lastType"> /// 最後に追加された要素種別の設定先。 /// 何も追加されなかった場合は prevType が設定される。 /// </param> /// <returns>追加された文字列長。</returns> private int AppendThousandPartPhonetic( string src, NumberPhoneType prevType, NumberPhoneType baseType, StringBuilder dest, out NumberPhoneType lastType) { int oldLen = dest.Length; // とりあえず prevType を設定しておく lastType = prevType; // 頭の "0" を削除 string text = src.TrimStart('0'); // 長さを算出 int len = text.Length; if (len == 0) { // "0" のみだった場合 string zero = DecideNumberKana( NumberPhoneType.Digit0, lastType, baseType); if (zero.Length > 0) { dest.Append(zero); lastType = NumberPhoneType.Digit0; } } else { // 種別配列を作成(baseType は含めない) var types = new List<NumberPhoneType>(); for (int i = 0; i < len; ++i) { // 数字 int d = ParseChar(text[i]); if (d == 0) { // "0" ならば後続も含めてスキップ continue; } types.Add( (NumberPhoneType)(NumberPhoneType.DigitBegin + d)); // 数字の後続 int pos = (len - 1) - i - 1; // 0:十, 1:百, 2:千 if (pos >= 0) { types.Add( (NumberPhoneType)(NumberPhoneType.BaseBegin + pos)); } } // 順番に処理 for (int i = 0; i < types.Count; ++i) { NumberPhoneType t = types[i]; NumberPhoneType next = (i + 1 < types.Count) ? types[i + 1] : baseType; string s = DecideNumberKana(t, lastType, next); if (s.Length > 0) { dest.Append(s); lastType = t; } } } // 以下のいずれかの場合は baseType を処理 // - baseType == NumberPhoneType.Point // - 1文字以上追加があった if (baseType.IsPoint() || dest.Length > oldLen) { string baseText = DecideNumberKana(baseType, lastType, NumberPhoneType.None); if (baseText.Length > 0) { dest.Append(baseText); lastType = baseType; } } return (dest.Length - oldLen); }
/// <summary> /// 整数部の構成要素の既定の読みを取得する。 /// </summary> /// <param name="type">対象の種別。</param> /// <returns>読み仮名。</returns> private static string GetDefaultNumberKana(NumberPhoneType type) => DefaultNumberKanas[(int)type];