【ハルシオンUnityブログ】一部海外でのfloat等小数点区切り文字が,(カンマ)で問題がでてしまう件
こんにちは。坂内っす。
ご機嫌麗しゅう?
ポケットガール~受け継がれし希望~よろしくお願いします。
URL(Android):https://play.google.com/store/apps/details?id=com.halcyon.pocketgirl3
URL(iOS):https://itunes.apple.com/jp/app/id1539553611
PV:
Unityで扱うfloatって「0.3」とか「122.22」とかって数値が入るじゃないですか。
これ、一部の海外だと「0,3」や「122,22」ってなっちゃうの知ってます?
[Oracleの区切り文字に関するガイド]
https://docs.oracle.com/cd/E19455-01/806-2727/overview-9/index.html#:~:text=%E3%82%A4%E3%82%AE%E3%83%AA%E3%82%B9%E3%81%A8%E7%B1%B3%E5%9B%BD%E3%81%A7%E3%81%AF%E5%B0%8F%E6%95%B0,%E5%8C%BA%E5%88%87%E3%81%A3%E3%81%9F%E3%82%8A%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82
こんな感じでフランス式の国では、小数点が,(カンマ)で区切られるようです。
Unityでもこれは対応されており、以下のようなコードを端末にビルドして、端末の言語設定を変えることで確認できます。
[Blog1120.cs]
日本語設定

フランス語設定

こんな感じ。
ちゃんカンマの小数点でも計算はしてくれますので問題はありません。
しかし、こんなコードが混ざっていると問題がおきます。
こんなことをした場合、結果が変わってきます。
日本語設定

フランス語設定

フランス語のほうは以下のエラーが出てしまいます。
IndexOutOfRangeException: Index was outside the bounds of the array.
at Blog1120.Start () [0x0002b] in:0
ドットがないため、ary[0]に「0,3」が入り、ary[1]には何も入らない状況になります。
対応策としては、Splitなどを複数charで行うことでできそうです。
string[] ary = flt.ToString().Split(new char[] {'.', ','});
ということで、一部海外(フランス式)のfloatやdoubleでの小数点の区切り文字問題の対応でした。
あでゅ~ノシ
ご機嫌麗しゅう?
ポケットガール~受け継がれし希望~よろしくお願いします。
URL(Android):https://play.google.com/store/apps/details?id=com.halcyon.pocketgirl3
URL(iOS):https://itunes.apple.com/jp/app/id1539553611
PV:
Unityで扱うfloatって「0.3」とか「122.22」とかって数値が入るじゃないですか。
これ、一部の海外だと「0,3」や「122,22」ってなっちゃうの知ってます?
[Oracleの区切り文字に関するガイド]
https://docs.oracle.com/cd/E19455-01/806-2727/overview-9/index.html#:~:text=%E3%82%A4%E3%82%AE%E3%83%AA%E3%82%B9%E3%81%A8%E7%B1%B3%E5%9B%BD%E3%81%A7%E3%81%AF%E5%B0%8F%E6%95%B0,%E5%8C%BA%E5%88%87%E3%81%A3%E3%81%9F%E3%82%8A%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82
こんな感じでフランス式の国では、小数点が,(カンマ)で区切られるようです。
Unityでもこれは対応されており、以下のようなコードを端末にビルドして、端末の言語設定を変えることで確認できます。
[Blog1120.cs]
using TMPro;
using UnityEngine;
public class Blog1120 : MonoBehaviour
{
[SerializeField] TMP_Text lbl1;
[SerializeField] TMP_Text lbl2;
void Start()
{
float flt = 0.3f;
lbl1.text = flt.ToString();
lbl2.text = (flt * 2f).ToString();
}
}
日本語設定

フランス語設定

こんな感じ。
ちゃんカンマの小数点でも計算はしてくれますので問題はありません。
しかし、こんなコードが混ざっていると問題がおきます。
using TMPro;
using UnityEngine;
public class Blog1120 : MonoBehaviour
{
[SerializeField] TMP_Text lbl1;
[SerializeField] TMP_Text lbl2;
void Start()
{
float flt = 0.3f;
lbl1.text = flt.ToString();
// 小数点のカンマ以降を取得
string[] ary = flt.ToString().Split(".");
lbl2.text = ary[1];
}
}
こんなことをした場合、結果が変わってきます。
日本語設定

フランス語設定

フランス語のほうは以下のエラーが出てしまいます。
IndexOutOfRangeException: Index was outside the bounds of the array.
at Blog1120.Start () [0x0002b] in
ドットがないため、ary[0]に「0,3」が入り、ary[1]には何も入らない状況になります。
対応策としては、Splitなどを複数charで行うことでできそうです。
string[] ary = flt.ToString().Split(new char[] {'.', ','});
ということで、一部海外(フランス式)のfloatやdoubleでの小数点の区切り文字問題の対応でした。
あでゅ~ノシ
Category: 開発日記(Unity)
| h o m e |