示例#1
0
 /// <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);
 }
示例#2
0
        /// <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);
        }
示例#3
0
 /// <summary>
 /// 整数部の構成要素の既定の読みを取得する。
 /// </summary>
 /// <param name="type">対象の種別。</param>
 /// <returns>読み仮名。</returns>
 private static string GetDefaultNumberKana(NumberPhoneType type) =>
     DefaultNumberKanas[(int)type];