/// <summary>
 /// コンストラクタ
 /// </summary>
 /// <param name="pSrc">コピー元</param>
 public NumericFullString(NumericFullString pSrc)
 {
     this.seisuu  = pSrc.seisuu;
     this.syousuu = pSrc.syousuu;
     this.IsMinus = pSrc.IsMinus;
     this.IsZero  = pSrc.IsZero;
 }
        /// <summary>
        /// 指数無し数字文字列作成
        /// </summary>
        /// <param name="pValue">指数付数字文字列([-+][0-9,][.][0-9,][eE][-+][0-9])</param>
        /// <returns>NumericFullString</returns>
        /// <remarks>
        /// ・"31.4E-1"のような指数付数字文字列を指数なしの形(3.14)に変換する
        /// ・pValueには1以上の文字数で構成される文字列を渡さなければならない
        /// </remarks>
        public NumericFullString MakeFullNumericString(string pValue)
        {
            NumericFullString result = new NumericFullString();

            // 符号分離
            string strwk = pValue.Replace(",", "").Replace(" ", "").Trim().ToUpper();

            if (strwk.Length == 0)
            {
                throw new ArgumentException("pValueに有効な文字が見つからない");
            }
            result.IsMinus = (strwk[0] == '-');
            strwk          = strwk.TrimStart('-', '+');

            // 仮数と指数を分離
            string[] strFields = strwk.Split('E');

            string kasuu = strFields[0];
            int    sisuu;

            if (strFields.Length < 2)
            {
                sisuu = 0;
            }
            else
            {
                sisuu = int.Parse(strFields[1]);
            }

            // 整数部と小数部に分離
            // 整数部の先頭とと小数部の末尾の'0'を取る
            strFields = kasuu.Split('.');

            StringBuilder seisuu = new StringBuilder(64);

            seisuu.Append(strFields[0].TrimStart('0'));

            StringBuilder syousuu = new StringBuilder(64);

            if (strFields.Length < 2)
            {
            }
            else
            {
                syousuu.Append(strFields[1].TrimEnd('0'));
            }

            // ゼロ?
            if ((seisuu.Length == 0) && (syousuu.Length == 0))
            {
                result.IsZero = true;
                return(result);
            }

            if (sisuu > 0)
            {
                while (sisuu > 0)
                {
                    char c;
                    if (syousuu.Length == 0)
                    {
                        c = '0';
                    }
                    else
                    {
                        c = syousuu[0];
                        syousuu.Remove(0, 1);
                    }

                    seisuu.Append(c);

                    sisuu--;
                }
            }
            else if (sisuu < 0)
            {
                while (sisuu < 0)
                {
                    char c;
                    if (seisuu.Length == 0)
                    {
                        c = '0';
                    }
                    else
                    {
                        int i = seisuu.Length - 1;
                        c = seisuu[i];
                        seisuu.Remove(i, 1);
                    }

                    syousuu.Insert(0, c);

                    sisuu++;
                }
            }

            result.Seisuu  = seisuu.ToString().TrimStart('0');
            result.Syousuu = syousuu.ToString().TrimEnd('0');

            return(result);
        }
        /// <summary>
        /// 大字文字列作成(数値文字列オブジェクト受取版)
        /// </summary>
        /// <param name="pValue">変換元、指数付数字文字列([-+][0-9,][.][0-9,][eE][-+][0-9])</param>
        /// <remarks>
        /// ・"31.4E-1"のような数値文字列を大字に変換する
        /// ・負数の場合は大字文字列の先頭に'-'が付加される
        /// ・該当する大数名称が無い大きな数値を与えた場合は下記2つの動作のうちいずれかとなる
        /// 1、例外を発生させる (throwExceptionByTaisuuOverflow==true)
        /// 2、大数名を付加せず文字列を作る (throwExceptionByTaisuuOverflow==false)
        /// ・千百十の位に対して'壱'を付加するか否かは append壱To千百十 フラグで決定される
        /// </remarks>
        public string MakeDaijiString(string pValue)
        {
            NumericFullString fullString = this.MakeFullNumericString(pValue);

            fullString.CutSyousuu();

            if (fullString.IsZero)
            {
                return(daijiTbl[0].ToString());
            }

            StringBuilder result = new StringBuilder(64);

            if (fullString.IsMinus)
            {
                result.Append('-');
            }

            string numberStr  = fullString.Seisuu;
            bool   append千百十一 = false;
            int    idx千百十一    = (4 - (numberStr.Length % 4)) % 4;

            int idx大数 = (numberStr.Length - 1) / 4;

            if (idx大数 >= taisuuTbl.Count)
            {
                if (this.throwExceptionByTaisuuOverflow)
                {
                    throw new OverflowException("大数名が見つからないもしくは無量大数");
                }
            }

            for (int i = 0; i < numberStr.Length; i++)
            {
                char c = numberStr[i];
                if (c != '0')
                {
                    int numberIdx = c - '0';
                    if (idx千百十一 == 3)
                    {
                        result.Append(this.daijiTbl[numberIdx]);
                        append千百十一 = true;
                    }
                    else
                    {
                        if ((numberIdx != 1) || this.append壱To千百十)
                        {
                            result.Append(this.daijiTbl[numberIdx]);
                            append千百十一 = true;
                        }
                    }

                    if (kanji千百拾Tbl[idx千百十一].Length > 0)
                    {
                        result.Append(kanji千百拾Tbl[idx千百十一]);
                        append千百十一 = true;
                    }
                }

                if (idx千百十一 == 3)
                {
                    if (append千百十一)
                    {
                        if (idx大数 < taisuuTbl.Count)
                        {
                            result.Append(taisuuTbl[idx大数]);
                        }
                    }
                }

                idx千百十一 = (idx千百十一 + 1) % 4;
                if (idx千百十一 == 0)
                {
                    append千百十一 = false;
                    idx大数--;
                }
            }

            return(result.ToString());
        }