今回も METAR/SPECI のハナシ。
METAR/SPECI が報告する形式で小学校算数で習う「帯分数」形式の表現が許されてるのね:
1 1 1/2SM
これは、視程が 1.5 statue miles (one and a half statute miles) であることを示してる。今、distn=”1 1/2″、unit=”SM” まで分解できているとして(distn には「M」(less than)プレフィクスがあることはここではいったん置いといて)、この分数表現のまま「Python 数値」に読み替えられないか?
1 >>> from fractions import Fraction
2 >>> float(Fraction("1/2"))
3 0.5
1 >>> Fraction("2 1/2")
2 Traceback (most recent call last):
3 File "<stdin>", line 1, in <module>
4 File "c:\Python27\lib\fractions.py", line 125, in __new__
5 numerator)
6 ValueError: Invalid literal for Fraction: '2 1/2'
あ、そうか:
1 >>> 2 + Fraction("1/2")
2 Fraction(5, 2)
3 >>> sum([Fraction(s) for s in "2 1/2".split(" ")])
4 Fraction(5, 2)
よしよし…。
ただなぁ、python のレベルまでは分数のまま維持出来ても、例えば json にしてなにがしかのクライアントが使う、て時にまた float か文字列にしなきゃならないてのも切ないよなぁ、とも一方では思う。ただその場合の文字列化は過分数(仮分数)のままの方が受け取る方もラクチンだろうから、まぁ決断自体はさしてむつかしくはない。(これをあえて帯分数に戻そうなんて思うかしらね、と思うし。(なぜなら 5/2 がわかりにくけりゃ 2.5 と言えばいいのだから。))