FreeBASIC マニュアルのトップに戻る

FreeBASIC Format

目次→実行時ライブラリー参考→文字列関数FORMAT←オリジナル・サイト

FORMAT 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい


指定された書式で、数を整形します。

構文:
declare function Format ( byval numerical_expression as double, byref formatting_expression as CONST String(文字列) = "" ) as String(文字列)

用法:
# include "vbcompat.bi" ←渡辺推奨
#include "string.bi"
result = Format[$] ( numerical_expression, formatting_expression )

パラメタ:
numerical_expression
整形される数
formatting_expression
整形に使う書式

戻り値:
Format は、数の表示形式を、書式で指示したように整形した、文字列を返します。
書式表現は、数値や日付・時間の値を生み出すことができる文字列です。

注意:
Format は、渡された値を常に Double に変換します。 上の「構文」を参照下さい。
このため表示できる結果の精度は、10進数て約15桁までになります。


記述:
意味のある日付・時間の値を取り出すために、数式は適切な関数から得られた日付データでなければなりません。

この関数は FreeBASIC の一部です。ただし、vbcompat.bistring.bi を含めておかないと、コンパイラによって認識されません。

数値の書式:
シンボル 記述
ヌル文字列 一般形式(フォーマットしない)
0
数字の代用:
書式表現のゼロの桁数より、数値の桁数が少ない場合は、前か後ろ(小数のどちらかの側)に、ゼロを表示します。
書式のゼロより、数値の小数の右の桁が多いときは、数は丸められます。
書式のゼロが、数値の小数の左(整数部分)の桁がより少なくても、数値の桁は、全て表示されます。
#
数字の代用:
上の 0 と同じような規則に従います。ただし、前後のゼロを表示しないという点が異なります。
.
小数点の代用。書式が、「.」の左に「#」だけの場合は、1より小さい数値は、小数点から始まります。
%
百分率: 数値を100倍した表示になります。そして、% の文字が、後ろに付きます。
,
3桁区切り符(コンマ)。
カンマを2つ並べた場合、または、小数点位置(小数点が明示されているか否かに関係なく)のすぐ左のカンマは、
「カンマに挟まれた3桁の数値、またはカンマと小数点に挟まれた3桁の数値を省略せよ。また必要に応じ丸めよ。」
ということを意味します。

小数部の指定の有無にかかわらず、小数点のすぐ左に 3 桁ごとの区切り記号がある場合、または文字列の一番右に桁区切り記号がある場合は、"数値を 1,000 で割って、必要に応じて丸める" ことを意味します。
500 以上で 1,000 未満の数値は 1 として表示され、500 未満の数値は 0 として表示されます。
同じ位置で 3 桁ごとの区切り記号が 2 つ連続する場合は、100 万で割って変換します。
このように、桁区切り記号が増えるごとに 1,000 倍の係数で変換されます。

小数点のすぐ左、または文字列の一番右以外の位置に複数の区切り記号がある場合は、通常の 3 桁ごとの区切り記号を指定したものとして単純に処理されます。
ロケールによっては、3 桁ごとの区切り記号としてピリオドが使用されます。
書式指定された出力で、実際に 3 桁ごとの区切り記号として使用される記号は、システムで認識される数値書式によって異なります。
したがって、桁区切り記号としてピリオドを使用するロケールであっても、書式指定の中ではコンマを 3 桁の桁区切り記号として使用する必要があります。
書式指定された文字列は、ロケールに対して適切な書式で表現されます。

例:数値 100000000 (1億)は、
"#,0." とした場合、桁区切り記号を用いて "100,000,000" と、文字列形式で表記されます。
"#0,." とした場合、1000 で割って位取りした数値、つまり、"100000" という文字列になります。
"#,0,." とした場合、1000 で割って位取りした結果が、桁区切り記号を用いて "100,000" という文字列形式で表記されます。
E- E+ e- e+ 指数表記形式:
書式が、「E-」「E+」「e-」「e+」の右に1個の桁代用(0か#)を含んでいるなら、数は指数表記で示されます。
「E」か「e」が、仮数と指数の間に挿入されて表示されます。
「0」または「#」の右には、指数で桁数が表示されます。
マイナス記号を、負の指数の次に置きたいときは、「E-」 または 「e-」を使います。
マイナス記号を負の指数の次に、また、プラス記号も正の指数の次に置きたいときには、「E+」または「e+」を使ってください。
: ? + $ () スペース その文字を、シンボルとしてではなく、そのままの文字として表示します。
これらの以外のシンボル文字を、文字そのものとして表示したい場合は、バックスラッシュ(\)をシンボル文字の前に付けるか、または二重引用マークでシンボル文字を囲んでください。
\
書式の記号列で、シンボル文字(書式記号の文字)を、それをシンボルではなく、文字そのままとして表示したいときは「\」を、そのシンボル文字の前に付けます。
「\」は、これに続く文字を、そのままの文字として表示させます。
二重引用符の間の文字 二重引用符の間に挟んで文字列を表示します。
:
時間分離符は、時間の値を整形するときに、時間、分、秒を分離するために使われます。
/
日付の分離符は、日付の値を整形するときに、日、月、年を分離するために、使われます。

日付-時間の書式:
シンボル 記述
d, dd
日を、1桁または2桁の数字で表示します。
(1-31/01-31)
ddd
曜日を、省略形で表示します。
(日-土)
dddd
日を、フルネームで表示します。
(日曜日-土曜日)
ddddd
完全な期日として、連続の日付の数を表示します。
(日、月、年を含んでいます)
m, mm
月を、1桁または2桁の数として表示します。
(1-12/01-12)
m が、h か hh に続いている場合は、月ではなく、分を表示します。
M, MM
M は、h か hh に続く場合でも、1桁または2桁の数として月を表示します。
(1-12/01-12)
mmm 省略語で、月を表示します。
(Jan-Dec)←日本語環境では使えない?
mmmm
フルネームで、月を表示します。
(1月-12月)
y, yy
年を、2桁の数として表示します。
(00-99)
yyyy
4桁の数として年を表示します。
(1900-2040)
h, hh
時間を、1桁または2桁の数として表示します。
(0-23/00-23)
m, mm
分を、1桁または2桁の数として表示します。
(0-59/00-59)
m が、h か hh にすぐ続かない場合は、分ではなく、月を表示します。
n, nn
h か hh に、すぐ続かない場合でも、1桁または2桁の数として分を表示します。
(0-59/00-59)
s, ss
秒を、1桁または2桁の数として表示します。
(0-59/00-59)
ttttt
時、分、秒の完全な時間として、時間通し番号を表示します。
AM/PM (Default), am/pm 12時間表示の時計を使用して、午前(正午まで)は AM かam を表示します。午後(正午と11:59の間)は、PM または pm を表示します。
A/P, a/p
/P/p
12時間表示の時計を使用して、午前(正午まで)は A または a を表示します。午後(正午から11:59の間)は、P または p を表示します。

時間と日付の区切り記号の表現は、地域またはローカライズされた設定がターゲット プラットフォームでサポートされている場合、オペレーティング システムから決定される場合があります。
この決定は実行時に行われるため、出力はプログラムが実行されているシステムにローカライズされます。


例1:
数値書式

#include "string.bi"
#include "vbcompat.bi"

Dim As Double numberVal(...) = {5, -5, .5}
Dim As String formatStr(...) = {"","0","0.00","#,##0","#,##0.00","0%", "0.00%", "0.00E+00", "0.00E-00"}

? "Format string",, Str(numberVal(0)), Str(numberVal(1)), Str(numberVal(2))
?
For iFormat As Integer = 0 To UBound(formatStr)
    ? formatStr(iFormat),,
    For iNumber As Integer = 0 To UBound(numberVal)
        ? Format(numberVal(iNumber), formatStr(iFormat)),
    Next
    ?
Next
Sleep
出力:
Format string               5             -5            0.5

'                           5             -5            .5            
0                           5             -5            0             
0.00                        5.00          -5.00         0.50          
#,##0                       5             -5            0             
#,##0.00                    5.00          -5.00         0.50          
0%                          500%          -500%         50%           
0.00%                       500.00%       -500.00%      50.00%        
0.00E+00                    5.00E+00      -5.00E+00     5.00E-01      
0.00E-00                    5.00E00       -5.00E00      5.00E-01      

例2:
日付と時間の書式
渡辺注:DateValue() は、地域の設定が、QB と同じ短い日付表示形式(mm-dd-yyyy) を指定する場合にだけ、正しく働きます。
日本語環境の場合は、DateSerial を使うと,簡単に設定できます。
DateValue ページ の例2 を参照下さい。


#include "vbcompat.bi"

Dim As Double dateTimeVal = DateValue("12/05/1958") + TimeValue("20:50:35")
Dim As String formatStr(...) = {"yyyy-mm-dd","d-mmmm-yy","d-mmm","dd-mmm","ddd-mmm","dddd-mmmm","ddddd-mmmm","mmmm-yyyy","h:mm AM/PM","h:mm:ss AM/PM","h:mm","h:mm:ss","m/d/yy h:mm"}

? "Format",, "Display"
?
For iFormat As Integer = 0 To UBound(formatStr)
    ? formatStr(iFormat),, Format(dateTimeVal, formatStr(iFormat))
Next
Sleep
出力:
Format                      Display

yyyy-mm-dd                  1958-12-05          ←「年」と「日」が違って表示される? DateSerial() を使うとよい。
d-mmmm-yy                   5-12月-58
d-mmm                       5-12
dd-mmm                      5-12
ddd-mmm                     土-12
dddd-mmmm                   土曜日-12月
ddddd-mmmm                  1899/12/30-12月
mmmm-yyyy                   12月-1958
h:mm AM/PM                  8:50 PM
h:mm:ss AM/PM               8:50:35 PM
h:mm                        20:50
h:mm:ss                     20:50:35
m/d/yy h:mm                 12/5/58 20:50


追加例1:
'PrintUsingBadidea
'Print Using
'by badidea ≫ Jun 24, 2020 20:55
'https://www.freebasic.net/forum/viewtopic.php?f=3&t=28653&p=273558&hilit=print+using#p273461

#Include "string.bi"

Dim As Long n = 1234567890

Print n
Print " ";
Print Format(n, "#,#")
Sleep
出力:
 1234567890
 1,234,567,890

追加例2:
#include "vbcompat.bi"

Dim MyFormat As String

Print Format(123456700.89, "#,##0.0") '表示 ?? 何故カンマが頭に付く?
Print Format(123456700.89, "###,##0")
Print Format(123456700.89, ",,.")
Print

'0 と . の書式指定による、数値の小数部の処理の例

MyFormat = "0.00"
Print Format(-1579.8, MyFormat)     '表示 "-1579,80"
Print Format(1579.8, MyFormat)      '表示 "1579,80"
Print Format(0.4, MyFormat)         '表示 "0,40"
Print Format(0.434, MyFormat)       '表示 "0,43"
Print

'数値の整数部の桁数が書式より小さい場合、該当桁には 0 が表示されます。

MyFormat = "0000.00"
Print Format(-1579.8, MyFormat)     '表示 "-1579,80"
Print Format(1579.8, MyFormat)      '表示 "1579,80"
Print Format(0.4, MyFormat)         '表示 "0000,40"
Print Format(0.434, MyFormat)       '表示 "0000,43"
Print

'「,」 は、千単位の桁区切り位置を指定するための記号で、OS のロケール設定に応じた桁区切り記号を表示させます。
'# は、該当桁の数字を表示させるよう指定する記号ですが、該当桁に数値が無い場合は何も表示させません。

MyFormat = "#,##0.00"
Print Format(-1579.8, MyFormat)     '表示 "-1.579,80"
Print Format(1579.8, MyFormat)      '表示 "1.579,80"
Print Format(0.4, MyFormat)         '表示 "0,40"
Print Format(0.434, MyFormat)       '表示 "0,43"
Print

'$ プレースホルダの代わりに、Format 関数は、システムで定義されている関連する通貨記号を表示します。

MyFormat = "#,##0.00 $"
Print Format(-1579.8, MyFormat)     '表示 "-1.579,80 $"
Print Format(1579.8, MyFormat)      '表示 "1.579,80 $"
Print Format(0.4, MyFormat)         '表示 "0,40 $"
Print Format(0.434, MyFormat)       '表示 "0,43 $"

Sleep


追加例3:
'PrintUsingDodicat
'Print Using
'by dodicat ≫ Jun 27, 2020 21:40
'https://www.freebasic.net/forum/viewtopic.php?f=3&t=28653&p=273558&hilit=print+using#p273558


Function Formatted(d As Double) As String
  Dim As String sn=IIf(d<0,"-","")
  d=Abs(d)
  Var f=Mid(Str(d),InStr(Str(d),"."))
  Var i=Mid(Str(d),1,InStr(Str(d),".")-1)
  Var L=Len(i)+1,k=1,lens=0
  lens=Len(i)
  For n As Long=0 To Int((lens-1)/2):Swap i[n],i[lens-1-n]:Next
    Do
      Var Ln =Len(i),p=(4*k)
      i =(Mid(i,1,P-1)) & "," & (Mid(i,P))
      k+=1
  Loop Until k>=L/3
    lens=Len(i)
    For n As Long=0 To Int((lens-1)/2):Swap i[n],i[lens-1-n]:Next
      Return sn+LTrim(i+f,",")
End Function
   
   
    ''to test only
    Function remove(ByVal txt As String,Char As String,start As Long=0,ByRef dups As String="") As String
      Var id = start
      For i As Long = start To Len(txt) - 1
        If txt[i]<>Asc(char) Then txt[id]=txt[i]:id+=1 Else dups=Chr(txt[i])
      Next
      Return Left(txt,id)
    End Function


    Dim As Long n
    For n =1 To 100000
      Var k=(Rnd*10000000-Rnd*10000000)'*100000
      Dim As String ans=Formatted(k)
      If Abs(Val(remove(ans,","))-k)>1e-4 Then
        Print "ERROR ",Formatted(k);Tab(40);k,Val(remove(Formatted(k),","))-k
      Else
        'If n<50 Then Print ans;Tab(40);k
        If n<20 Then Print ans;Tab(40);k
      End If
    Next
    Print
    Print n-1; "  tests, done . . ."
    Sleep


方言差:
なし

QBからの違い:

参照:
文字列関数に戻ります。

←リンク元に戻る プログラム開発関連に戻る

ページ歴史:2022-12-31 14:06:23
日本語翻訳:WATANABE Makoto、原文著作者:AntoniGual

ホームページのトップに戻る

表示-非営利-継承