groovy の使用がオプションの場合、次のバージョンがあります。
- 後置されていない文字列を処理します (つまり、数字 "1234" のみ)
- スペースとコンマを処理します (「12,234B」または「12 234kB」など)
- 入力文字列の解析に失敗した場合、やや説明的な例外をスローします
- 間違った大文字と小文字の接頭辞とバイト インジケータを処理します。これは良い考えではないと主張することができます。私の特定のユースケースでは、不正確なデータが得られることが多いため、アルゴリズムのルールを多少緩和すると便利です。
コード:
import static groovy.test.GroovyAssert.shouldFail
long toBytes(String size) {
def matcher = size?.replaceAll(/[, ]/, '') =~ /(?i)^([\d.,]+)([PTGMK]?B)?$/
if (!matcher) throw new IllegalArgumentException("Can not parse size string '${size}'")
(matcher[0][1] as BigDecimal) * 1024**[PB:5, TB:4, GB:3, MB:2, KB:1].withDefault {0}[matcher[0][2]?.toUpperCase()]
}
assert toBytes(" 112 ") == 112
assert toBytes("112") == 112
assert toBytes("123456789") == 123456789
assert toBytes("1B") == 1
assert toBytes("1KB") == 1024
assert toBytes("300MB") == 300g*1024*1024
assert toBytes("1.2mb") == 1.2g*1024*1024 as Long
assert toBytes("123 456kB") == 123456g*1024
assert toBytes("123,456B") == 123456
assert toBytes("1.5GB") == 1.5g*1024*1024*1024
assert toBytes("300MB") == 300g*1024*1024
assert toBytes("512GB") == 512g*1024*1024*1024
assert toBytes("1Tb") == 1024g*1024*1024*1024
assert toBytes("1PB") == 1024g*1024*1024*1024*1024
def checkFailure = { c ->
assert shouldFail(c).message.startsWith("Can not parse size string")
}
checkFailure { toBytes(null) }
checkFailure { toBytes("") }
checkFailure { toBytes("x112") }
checkFailure { toBytes("112x") }
checkFailure { toBytes("11x2") }
このメソッドは、読みやすさのために最適化されていない可能性があります。コードを簡潔に保ちながら、すべてのエッジケースを取得しようとするのは楽しいことでした.