using System;\r
using System.Collections.Generic;\r
+using System.Globalization;\r
using System.Text;\r
using System.IO;\r
using System.Windows.Forms;\r
using DTXCreator.UndoRedo;\r
using DTXCreator.WAV_BMP_AVI;\r
using FDK;\r
+using System.Diagnostics;\r
\r
namespace DTXCreator\r
{\r
{\r
return false;\r
}\r
- float result = 0f;\r
- if( ( !float.TryParse( strパラメータ, out result ) || ( result < 0f ) ) || ( result > 1000f ) )\r
+ decimal result = 0;\r
+ if( ( !this.TryParse( strパラメータ, out result ) || ( result < 0 ) ) || ( result > 1000 ) ) // #23880 2011.1.6 yyagi\r
{\r
return false;\r
}\r
- this._Form.mgr譜面管理者.dicBPx.Add( key, result );\r
+ this._Form.mgr譜面管理者.dicBPx.Add(key, (float)result);\r
return true;\r
}\r
private bool tDTX入力・行解析・DTXC_AVIBACKCOLOR( string strコマンド, string strパラメータ, string strコメント )\r
if( strコマンド.Equals( "BPM", StringComparison.OrdinalIgnoreCase ) )\r
{\r
decimal num;\r
- if( !decimal.TryParse( strパラメータ, out num ) )\r
+ if( !this.TryParse( strパラメータ, out num ) ) // #23880 2011.1.6 yyagi\r
{\r
num = 120.0M;\r
}\r
}\r
if( num2 == 2 )\r
{\r
- float num3;\r
- if( !float.TryParse( strパラメータ, out num3 ) )\r
+ decimal dBarLength;\r
+ if( !decimal.TryParse( strパラメータ, out dBarLength ) ) // #23880 2011.1.6 yyagi\r
{\r
- num3 = 1f;\r
+ dBarLength = 1m;\r
}\r
- this.dic小節長倍率.Add( num, num3 );\r
+ this.dic小節長倍率.Add( num, (float)dBarLength );\r
return true;\r
}\r
if( ( num2 >= 0x20 ) && ( num2 <= 0x27 ) )\r
}\r
return true;\r
}\r
- //-----------------\r
+\r
+ #region [#23880 2010.12.30 yyagi: コンマとスペースの両方を小数点として扱うTryParse]\r
+ /// <summary>\r
+ /// 小数点としてコンマとピリオドの両方を受け付けるTryParse()\r
+ /// </summary>\r
+ /// <param name="s">strings convert to double</param>\r
+ /// <param name="result">parsed double value</param>\r
+ /// <returns>s が正常に変換された場合は true。それ以外の場合は false。</returns>\r
+ /// <exception cref="ArgumentException">style が NumberStyles 値でないか、style に NumberStyles.AllowHexSpecifier 値が含まれている</exception>\r
+ private bool TryParse(string s, out decimal result)\r
+ { // #23880 2010.12.30 yyagi: alternative TryParse to permit both '.' and ',' for decimal point\r
+ // EU諸国での #BPM 123,45 のような記述に対応するため、\r
+ // 小数点の最終位置を検出して、それをlocaleにあった\r
+ // 文字に置き換えてからTryParse()する\r
+ // 桁区切りの文字はスキップする\r
+\r
+ const string DecimalSeparators = ".,"; // 小数点文字\r
+ const string GroupSeparators = ".,' "; // 桁区切り文字\r
+ const string NumberSymbols = "0123456789"; // 数値文字\r
+\r
+ int len = s.Length; // 文字列長\r
+ int decimalPosition = len; // 真の小数点の位置 最初は文字列終端位置に仮置きする\r
+\r
+ for (int i = 0; i < len; i++)\r
+ { // まず、真の小数点(一番最後に現れる小数点)の位置を求める\r
+ char c = s[i];\r
+ if (NumberSymbols.IndexOf(c) >= 0)\r
+ { // 数値だったらスキップ\r
+ continue;\r
+ }\r
+ else if (DecimalSeparators.IndexOf(c) >= 0)\r
+ { // 小数点文字だったら、その都度位置を上書き記憶\r
+ decimalPosition = i;\r
+ }\r
+ else if (GroupSeparators.IndexOf(c) >= 0)\r
+ { // 桁区切り文字の場合もスキップ\r
+ continue;\r
+ }\r
+ else\r
+ { // 数値・小数点・区切り文字以外がきたらループ終了\r
+ break;\r
+ }\r
+ }\r
+\r
+ StringBuilder decimalStr = new StringBuilder(16);\r
+ for (int i = 0; i < len; i++)\r
+ { // 次に、localeにあった数値文字列を生成する\r
+ char c = s[i];\r
+ if (NumberSymbols.IndexOf(c) >= 0)\r
+ { // 数値だったら\r
+ decimalStr.Append(c); // そのままコピー\r
+ }\r
+ else if (DecimalSeparators.IndexOf(c) >= 0)\r
+ { // 小数点文字だったら\r
+ if (i == decimalPosition)\r
+ { // 最後に出現した小数点文字なら、localeに合った小数点を出力する\r
+ decimalStr.Append(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator);\r
+ }\r
+ }\r
+ else if (GroupSeparators.IndexOf(c) >= 0)\r
+ { // 桁区切り文字だったら\r
+ continue; // 何もしない(スキップ)\r
+ }\r
+ else\r
+ {\r
+ break;\r
+ }\r
+ }\r
+ return decimal.TryParse(decimalStr.ToString(), out result); // 最後に、自分のlocale向けの文字列に対してTryParse実行\r
+ }\r
+ #endregion\r
+ //----------------- //-----------------\r
#endregion\r
}\r
}\r
using System;\r
using System.Collections.Generic;\r
+using System.Globalization;\r
+using System.Threading;\r
using System.Windows.Forms;\r
using System.Drawing;\r
using System.ComponentModel;\r
\r
try\r
{\r
+ #region [ もし小数点にコンマを使うcultureなら、一時的に(小数点を使う)"en"に切り替える。(DTXVはピリオドしか使えないため) ]\r
+ string currentCultureEinglishName = CultureInfo.CurrentCulture.EnglishName;\r
+ if (CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator == ",")\r
+ {\r
+ Thread.CurrentThread.CurrentCulture = new CultureInfo("en", false);\r
+ }\r
+ #endregion\r
#region [ 一時ファイルにDTXを出力する。 ]\r
//-----------------\r
StreamWriter sw = new StreamWriter( this.strViewer演奏用一時ファイル名, false, Encoding.GetEncoding( 0x3a4 ) );\r
sw.Close();\r
//-----------------\r
#endregion\r
+ #region [ cultureを元に戻す。 ]\r
+ if (CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator == ",")\r
+ {\r
+ Thread.CurrentThread.CurrentCulture = new CultureInfo(currentCultureEinglishName, false);\r
+ }\r
+ #endregion\r
}\r
finally\r
{\r