OSDN Git Service

#24029 BPM等の小数点として"."と","のどちらも受け付けるように修正。ただしDTXVは"."しか受け付けないため、DTXCへのテンポラリ出力のみ"....
authoryyagi <yyagi@16f42ceb-6dc6-49c8-ba94-f2d53467949d>
Thu, 6 Jan 2011 17:45:20 +0000 (17:45 +0000)
committeryyagi <yyagi@16f42ceb-6dc6-49c8-ba94-f2d53467949d>
Thu, 6 Jan 2011 17:45:20 +0000 (17:45 +0000)
git-svn-id: http://svn.osdn.jp/svnroot/dtxmania/trunk@53 16f42ceb-6dc6-49c8-ba94-f2d53467949d

DTXCreatorプロジェクト/コード/00.全体/CDTX入出力.cs
DTXCreatorプロジェクト/コード/00.全体/Cメインフォーム.cs

index 91333bf..2b818c6 100644 (file)
@@ -1,5 +1,6 @@
 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
@@ -9,6 +10,7 @@ using DTXCreator.譜面;
 using DTXCreator.UndoRedo;\r
 using DTXCreator.WAV_BMP_AVI;\r
 using FDK;\r
+using System.Diagnostics;\r
 \r
 namespace DTXCreator\r
 {\r
@@ -446,12 +448,12 @@ namespace DTXCreator
                        {\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
@@ -732,7 +734,7 @@ namespace DTXCreator
                        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
@@ -931,12 +933,12 @@ namespace DTXCreator
                        }\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
@@ -2062,7 +2064,78 @@ namespace DTXCreator
                        }\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
index 7f67896..4d39353 100644 (file)
@@ -1,5 +1,7 @@
 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
@@ -1617,6 +1619,13 @@ namespace DTXCreator
 \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
@@ -1624,6 +1633,12 @@ namespace DTXCreator
                                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