回答編集履歴
1
refactor
answer
CHANGED
@@ -1,20 +1,19 @@
|
|
1
1
|
ちょ、退会すんなよ。
|
2
2
|
|
3
|
-
100を百にしようと思うと大変だけど、一〇〇でいいなら、Linqで
|
3
|
+
100を百にしようと思うと大変だけど、一〇〇でいいなら、Linqで。
|
4
|
-
漢数字をlist(配列とかList)でもつか、map(Dictinary)でもつか2パターン
|
5
|
-
引数を数字と見るか、文字列と見るかで2パターン
|
6
|
-
(さらに書きませんでしたが文字列の場合、数値だけを抜き出しておきかえる、というパターンもあり得るが、Where(char.isDigit)をSelectの前に入れればいいので)
|
7
|
-
C#でこの程度で10回if書いてたら話になりません。
|
8
4
|
|
9
5
|
```csharp
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
6
|
+
static string ConvertToKansuji(int n) => string.Concat(EnumerateDigits(n).Select(i => ToKansujiOnBaseByString(i)).Reverse());
|
7
|
+
static string ConvertToKansuji(string str, bool onlyDigits = false) => string.Concat(str.ToCharArray().Where(c => !onlyDigits || char.IsDigit(c)).Select(c => char.IsDigit(c) ? ToKansujiOnBaseByDictionary(c) : $"{c}"));
|
8
|
+
static IEnumerable<int> EnumerateDigits(int n, int unit = 10)
|
9
|
+
{
|
10
|
+
while (n >= unit)
|
11
|
+
{
|
12
|
+
yield return n % unit;
|
13
|
+
n = n / unit;
|
14
|
+
}
|
15
|
+
}
|
16
|
+
static string ToKansujiOnBaseByString(int n, int unit = 10) => unit > 10 || n >= unit ? throw new InvalidOperationException("illegal") : $"{"〇一二三四五六七八九"[n]}";
|
17
|
+
static string ToKansujiOnBaseByArray(int n, int unit = 10) => unit > 10 || n >= unit ? throw new InvalidOperationException("illegal") : (new[] { "〇", "一", "二", "三", "四", "五", "六", "七", "八", "九", })[n];
|
18
|
+
static string ToKansujiOnBaseByDictionary(char n, int unit = 10) => unit > 10 || !char.IsDigit(n) || (int)char.GetNumericValue(n) >= unit ? throw new InvalidOperationException("illegal") : (new Dictionary<char, string> { { '0', "〇" }, { '1', "一" }, { '2', "二" }, { '3', "三" }, { '4', "四" }, { '5', "五" }, { '6', "六" }, { '7', "七" }, { '8', "八" }, { '9', "九" }, })[n];
|
20
19
|
```
|