/// <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()); }