F#で Shift-JIS 文字列のカットと左詰右詰

右詰の文字列カットはとりあえずこの仕様のままにします。
違和感はありますが、日本では入力が左から右なので問題ないと判断。


■実行テスト

> padLeftText '@' 10 "1234567890";;
val it : string = "1234567890"
> padLeftText '@' 10 "123456789";;
val it : string = "123456789@"
> padLeftText '@' 10 "123456789あ";;
val it : string = "123456789@"
> padRightText '@' 10 "1234567890";;
val it : string = "1234567890"
> padRightText '@' 10 "123456789";;
val it : string = "@123456789"
> padRightText '@' 10 "123456789あ";;
val it : string = "@123456789"

ソースコード

open System
open System.Text

/// 左詰右詰の判別共用体
type PadType = PadLeft | PadRight

/// SJISエンコーディング
let sjis = Encoding.GetEncoding(932)

/// 指定サイズ内に収まる形で文字列をカットし指定文字で左詰または右詰した文字列を返す。
let padText (enc:Encoding) pt pc size (text:string) =
    text
    |> Seq.scan (fun (_,size) c ->
        let s = string c
        s,size + enc.GetByteCount(s)) ("",0)
    |> Seq.takeWhile (snd >> (>=)size)
    |> Seq.fold (fun (a,_) (s,c) -> a+s,c) ("",0)
    |> (fun (s,c) ->
        if c = size then s
        else
            let pad = (new String(pc, size-c))
            match pt with
            | PadType.PadLeft -> s + pad
            | PadType.PadRight -> pad + s
    )

/// 指定サイズでカットした文字列を指定文字で左詰めした文字を返す。
let padLeftText = padText sjis PadType.PadLeft

/// 指定サイズでカットした文字列を指定文字で右詰めした文字を返す。
let padRightText = padText sjis PadType.PadRight
    • -