IFormatProvider インターフェイスとは? わかりやすく解説

Weblio 辞書 > コンピュータ > .NET Framework クラス ライブラリ リファレンス > IFormatProvider インターフェイスの意味・解説 

IFormatProvider インターフェイス

書式制御するオブジェクト取得するための機構提供します

名前空間: System
アセンブリ: mscorlib (mscorlib.dll 内)
構文構文

<ComVisibleAttribute(True)> _
Public Interface IFormatProvider
Dim instance As IFormatProvider
[ComVisibleAttribute(true)] 
public interface IFormatProvider
[ComVisibleAttribute(true)] 
public interface class IFormatProvider
/** @attribute ComVisibleAttribute(true) */ 
public interface IFormatProvider
ComVisibleAttribute(true) 
public interface IFormatProvider
解説解説

共通言語ランタイム一部メソッドは、値を文字列形式に、または文字形式を値に変換し1 つ上の文字含まれた、書式指定子と呼ばれる文字列パラメータ受け取ります。この書式指定子は、値の変換方法示します書式指定の意味がカルチャによって異な場合は、文字列形式使用される実際文字書式指定オブジェクトによって提供されます。

クラス型または値型は、このインターフェイスの GetFormat メソッド実装して、書式情報実装型の処理を提供するオブジェクト取得します

たとえば、IFormatProvider は、NumberFormatInfo と DateTimeFormatInfo によって実装されますNumberFormatInfo は、基本データ型数値書式指定するときに使用するカルチャ固有の情報提供しDateTimeFormatInfo日時の値の形式指定するときに使用するカルチャ固有の情報提供します

使用例使用例

次のコード例は、IFormatProvider インターフェイスGetFormat メソッド実装したクラス使用方法示したものです。AnyRadix クラスは、"Ra" 書式設定コードサポートし、Int64 の値を 2 ~ 36指定され基数文字列変換しますGetFormat は、Type パラメータが ICustomFormatter を実装したクラス参照している場合は、自分自身への参照返しますそれ以外場合GetFormatnull 参照 (Visual Basic では Nothing) を返します

' Sample for the IFormatProvider interface and
' the IFormatProvider.GetFormat( Type ) method.
Imports System
Imports Microsoft.VisualBasic

' This class implements the "Ra" formatting code. An instance
 of this 
' class should be passed to methods requiring an IFormatProvider.
Public Class AnyRadix
    Implements ICustomFormatter 
    Implements IFormatProvider

    ' The value to be formatted is returned as a signed string 
    ' of digits from the rDigits array. 
    Const radixCode As String
 = "Ra"
    Private Shared rDigits As
 Char( ) = { _
        "0"c, "1"c,
 "2"c, "3"c, "4"c,
 "5"c, "6"c, "7"c, "8"c, _
        "9"c, "A"c,
 "B"c, "C"c, "D"c,
 "E"c, "F"c, "G"c, "H"c, _
        "I"c, "J"c,
 "K"c, "L"c, "M"c,
 "N"c, "O"c, "P"c, "Q"c, _
        "R"c, "S"c,
 "T"c, "U"c, "V"c,
 "W"c, "X"c, "Y"c, "Z"c }
        
    ' This method returns an object that implements ICustomFormatter
 
    ' to do the formatting. 
    Public Function GetFormat( argType As
 Type ) As Object _
        Implements IFormatProvider.GetFormat

        ' Here, the same object (Me) is returned, but it would be 
        ' possible to return an object of a different type.
        If argType Is GetType(
 ICustomFormatter ) Then
            Return Me
        Else
            Return Nothing
        End If
    End Function 
        
    ' This method does the formatting only if it recognizes the 
    ' format codes. 
    Public Function Format( formatString As
 String, _
        argToBeFormatted As Object, _
        provider As IFormatProvider ) As String
 _
        Implements ICustomFormatter.Format
            
        ' If no format string is provided or the format string cannot
 
        ' be handled, use IFormattable or standard string processing.
        If formatString Is Nothing
 OrElse _
            Not formatString.Trim( ).StartsWith( radixCode ) Then

            If TypeOf argToBeFormatted Is
 IFormattable Then
                Return CType( argToBeFormatted, IFormattable ).
 _
                    ToString( formatString, provider )
            Else
                Return argToBeFormatted.ToString( )
            End If
        End If 

        ' The formatting is handled here.
        Dim digitIndex          As Integer
 = 0
        Dim radix               As Long
 
        Dim longToBeFormatted   As Long
 
        Dim longPositive        As Long
        Dim outDigits( 63 )     As Char
            
        ' Extract the radix from the format string.
        formatString = formatString.Replace( radixCode, ""
 )
        Try
            radix = Convert.ToInt64( formatString )
        Catch ex As Exception
            Throw New ArgumentException( String.Format(
 _
                "The radix ""{0}""
 is invalid.", _
                formatString ), ex )
        End Try

        ' Verify that the radix is in the proper range.
        If radix < 2 OrElse radix > 36
 Then
            Throw New ArgumentException( String.Format(
 _
                "The radix ""{0}""
 is not in the range 2..36.", _
                formatString ) )
        End If
            
        ' Verify that the argument can be converted to a long integer.
        Try
            longToBeFormatted = CType( argToBeFormatted, Long
 )
        Catch ex As Exception
            Throw New ArgumentException( String.Format(
 _
                "The argument ""{0}""
 cannot be " & _
                "converted to an integer value.",
 _
                argToBeFormatted ), ex )
        End Try
            
        ' Extract the magnitude for conversion.
        longPositive = Math.Abs( longToBeFormatted )

        ' Convert the magnitude to a digit string.
        For digitIndex = 0 To 64
            If longPositive = 0 Then Exit
 For

            outDigits( outDigits.Length - digitIndex - 1 ) = _
                rDigits( longPositive Mod radix )
            longPositive \= radix
        Next digitIndex
            
        ' Add a minus sign if the argument is negative.
        If longToBeFormatted < 0 Then
            outDigits( outDigits.Length - digitIndex - 1 ) = "-"c
 
            digitIndex += 1
        End If 

        Return New String(
 outDigits, _
            outDigits.Length - digitIndex, digitIndex )
    End Function 
End Class

Module IFormatProviderDemo
    
    Sub ConvertToAnyRadix( argToConvert As
 Object, _
        formatStr As String )

        Dim provider As New
 AnyRadix( )
        Dim messageStr As String
 = _
            String.Format( "{{0:{0}}}",
 formatStr )

        ' Write the first part of the output line.
        Console.Write( "{0,18}  {1,-6}", _ 
            argToConvert, formatStr )

        ' Convert the specified argument using the specified format.
        Try
            Console.WriteLine( String.Format( _
                provider, messageStr, argToConvert ) )
        Catch ex As Exception
            Dim lineEnd As Integer
 = _
                ex.ToString( ).IndexOf( vbLf )
            Console.WriteLine( _
                ex.ToString( ).Substring( 0, lineEnd ) )
            Console.WriteLine( )
        End Try
    End Sub 
        
    Sub Main( )
        Dim TwoToThe32      As Long
 = 4294967296
        Dim fifteenNines    As Long
 = 999999999999999
            
        Console.WriteLine( _
            "This example of the IFormatProvider interface "
 & _
            vbCrLf & "and the IFormatProvider."
 & _
            "GetFormat( Type ) method " & vbCrLf
 & _
            "generates the following output." &
 vbCrLf )
        Console.WriteLine( "{0,18} Format Result",
 "Number" )
        Console.WriteLine( "{0,18} ------ ------",
 "------" )
            
        ' These are valid conversions.
        ConvertToAnyRadix( TwoToThe32, "Ra2" )
        ConvertToAnyRadix( TwoToThe32, "Ra5" )
        ConvertToAnyRadix( TwoToThe32, "Ra16" )
        ConvertToAnyRadix( TwoToThe32, "Ra23" )
        ConvertToAnyRadix( TwoToThe32, "Ra36" )
        ConvertToAnyRadix( fifteenNines, "Ra2" )
        ConvertToAnyRadix( fifteenNines, "Ra3" )
        ConvertToAnyRadix( fifteenNines, "Ra8" )
        ConvertToAnyRadix( fifteenNines, "Ra11" )
        ConvertToAnyRadix( fifteenNines, "Ra16" )
        ConvertToAnyRadix( fifteenNines, "Ra23" )
        ConvertToAnyRadix( fifteenNines, "Ra36" )
        ConvertToAnyRadix( fifteenNines, "E16" )
        ConvertToAnyRadix( fifteenNines, "" )
            
        ' These are error conditions.
        ConvertToAnyRadix( fifteenNines, "Ra37" )
        ConvertToAnyRadix( "ABCDEFGHIJKLM", "Ra16"
 )
    End Sub 
End Module 

' This example of the IFormatProvider interface
' and the IFormatProvider.GetFormat( Type ) method
' generates the following output.
' 
'             Number Format Result
'             ------ ------ ------
'         4294967296  Ra2   100000000000000000000000000000000
'         4294967296  Ra5   32244002423141
'         4294967296  Ra16  100000000
'         4294967296  Ra23  1606K7IC
'         4294967296  Ra36  1Z141Z4
'    999999999999999  Ra2   11100011010111111010100100110001100111111111111111
'    999999999999999  Ra3   11212010201001210101011021212000
'    999999999999999  Ra8   34327724461477777
'    999999999999999  Ra11  26A6A3689065639
'    999999999999999  Ra16  38D7EA4C67FFF
'    999999999999999  Ra23  1134DIFHLMM4
'    999999999999999  Ra36  9UGXNORJLR
'    999999999999999  E16   9.9999999999999900E+014
'    999999999999999        999999999999999
'    999999999999999  Ra37  System.ArgumentException: The radix "37"
 is not in
' the range 2..36.
' 
'      ABCDEFGHIJKLM  Ra16  System.ArgumentException: The argument "ABCDEFGHIJK
' LM" cannot be converted to an integer value. ---> System.InvalidCastException
' : Cast from string "ABCDEFGHIJKLM" to type 'Long' is not
 valid. ---> System.F
' ormatException: Input string was not in a correct format.
// Sample for the IFormatProvider interface and
// the IFormatProvider.GetFormat( Type ) method.
using System;

// This class implements the "Ra" formatting code. An instance
 of this 
// class should be passed to methods requiring an IFormatProvider.
public class AnyRadix : ICustomFormatter, IFormatProvider
{
    // The value to be formatted is returned as a signed string 
    // of digits from the rDigits array. 
    const string radixCode = "Ra";
    private static char[]
 rDigits = {
        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 
        'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 
        'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 
        'U', 'V', 'W', 'X', 'Y', 'Z' };
        
    // This method returns an object that implements ICustomFormatter
 
    // to do the formatting. 
    public object GetFormat( Type argType )
    {
        // Here, the same object (this) is returned, but it would 
        // be possible to return an object of a different type.
        if ( argType == typeof( ICustomFormatter ) )
            return this;
        else
            return null;
    } 
        
    // This method does the formatting only if it recognizes the 
    // format codes. 
    public string Format( string
 formatString, 
        object argToBeFormatted, IFormatProvider provider )
    {
        // If no format string is provided or the format string cannot
 
        // be handled, use IFormattable or standard string processing.
        if( formatString == null || 
            ! formatString.Trim( ).StartsWith( radixCode ) )
        {
            if( argToBeFormatted is IFormattable )
                return ( (IFormattable)argToBeFormatted ).
                    ToString( formatString, provider );
            else
                return argToBeFormatted.ToString( );
        }

        // The formatting is handled here.
        int     digitIndex = 0;
        long    radix;
        long    longToBeFormatted;
        long    longPositive;
        char[ ] outDigits = new char[
 63 ];
            
        // Extract the radix from the format string.
        formatString = formatString.Replace( radixCode, "" );
        try
        {
            radix = Convert.ToInt64( formatString );
        }
        catch( Exception ex )
        {
            throw new ArgumentException( String.Format( 
                "The radix \"{0}\" is invalid.", 
                formatString ), ex );
        }

        // Verify that the radix is in the proper range.
        if( radix <2 || radix > 36 )
            throw new ArgumentException( String.Format( 
                "The radix \"{0}\" is not in the
 range 2..36.", 
                formatString ) );
            
        // Verify that the argument can be converted to a long integer.
        try
        {
            longToBeFormatted = (long)argToBeFormatted;
        }
        catch( Exception ex )
        {
            throw new ArgumentException( String.Format(
                "The argument \"{0}\" cannot be " +
                "converted to an integer value.", 
                argToBeFormatted ), ex );
        }
            
        // Extract the magnitude for conversion.
        longPositive = Math.Abs( longToBeFormatted );

        // Convert the magnitude to a digit string.
        for( digitIndex = 0; digitIndex <= 64; digitIndex++
 )
        {
            if( longPositive == 0 ) break;

            outDigits[ outDigits.Length - digitIndex - 1 ] = 
                rDigits[ longPositive % radix ];
            longPositive /= radix;
        }
            
        // Add a minus sign if the argument is negative.
        if( longToBeFormatted < 0 )
            outDigits[ outDigits.Length - digitIndex++ - 1 ] = 
                '-';

        return new string(
 outDigits, 
            outDigits.Length - digitIndex, digitIndex );
    } 
} 

class IFormatProviderDemo
{
    static void ConvertToAnyRadix( object argToConvert,
 
        string formatStr )
    {
        AnyRadix    provider = new AnyRadix( );
        string      messageStr = 
            String.Format( "{{0:{0}}}", formatStr );

        // Write the first part of the output line.
        Console.Write( "{0,18}  {1,-6}", argToConvert, formatStr );

        // Convert the specified argument using the specified format.
        try
        {
            Console.WriteLine( String.Format( 
                provider, messageStr, argToConvert ) );
        }
        catch( Exception ex )
        {
            // Display the exception without the stack trace.
            int lineEnd = ex.ToString( ).IndexOf( '\n' );
            Console.WriteLine( "{0}\n",
                ex.ToString( ).Substring( 0, lineEnd ) );
        }
    } 
        
    static void Main( )
    {
        long twoToThe32 = 4294967296;
        long fifteenNines = 999999999999999;
            
        Console.WriteLine(
            "This example of the IFormatProvider interface \n" +
            "and the IFormatProvider.GetFormat( Type ) method " +
            "\ngenerates the following output.\n" );
        Console.WriteLine( "{0,18} Format Result", "Number" );
        Console.WriteLine( "{0,18} ------ ------", "------" );
            
        // These are valid conversions.
        ConvertToAnyRadix( twoToThe32, "Ra2" );
        ConvertToAnyRadix( twoToThe32, "Ra5" );
        ConvertToAnyRadix( twoToThe32, "Ra16" );
        ConvertToAnyRadix( twoToThe32, "Ra23" );
        ConvertToAnyRadix( twoToThe32, "Ra36" );
        ConvertToAnyRadix( fifteenNines, "Ra2" );
        ConvertToAnyRadix( fifteenNines, "Ra3" );
        ConvertToAnyRadix( fifteenNines, "Ra8" );
        ConvertToAnyRadix( fifteenNines, "Ra11" );
        ConvertToAnyRadix( fifteenNines, "Ra16" );
        ConvertToAnyRadix( fifteenNines, "Ra23" );
        ConvertToAnyRadix( fifteenNines, "Ra36" );
        ConvertToAnyRadix( fifteenNines, "E16" );
        ConvertToAnyRadix( fifteenNines, "" );
            
        // These are error conditions.
        ConvertToAnyRadix( fifteenNines, "Ra37" );
        ConvertToAnyRadix( "ABCDEFGHIJKLM", "Ra16" );
    } 
} 

/*
This example of the IFormatProvider interface
and the IFormatProvider.GetFormat( Type ) method
generates the following output.

            Number Format Result
            ------ ------ ------
        4294967296  Ra2   100000000000000000000000000000000
        4294967296  Ra5   32244002423141
        4294967296  Ra16  100000000
        4294967296  Ra23  1606K7IC
        4294967296  Ra36  1Z141Z4
   999999999999999  Ra2   11100011010111111010100100110001100111111111111111
   999999999999999  Ra3   11212010201001210101011021212000
   999999999999999  Ra8   34327724461477777
   999999999999999  Ra11  26A6A3689065639
   999999999999999  Ra16  38D7EA4C67FFF
   999999999999999  Ra23  1134DIFHLMM4
   999999999999999  Ra36  9UGXNORJLR
   999999999999999  E16   9.9999999999999900E+014
   999999999999999        999999999999999
   999999999999999  Ra37  System.ArgumentException: The radix "37" is not
 in th
e range 2..36.

     ABCDEFGHIJKLM  Ra16  System.ArgumentException: The argument "ABCDEFGHIJKLM
" cannot be converted to an integer value. ---> System.InvalidCastException:
 Sp
ecified cast is not valid.
*/
// Sample for the IFormatProvider interface and
// the IFormatProvider::GetFormat( Type* ) method.
using namespace System;

// This class implements the "Ra" formatting code. An instance
 of this 
// class should be passed to methods requiring an IFormatProvider.
ref class AnyRadix: public IFormatProvider,
 public ICustomFormatter
{
private:
   static Object^ null = nullptr;

   // The value to be formatted is returned as a signed string 
   // of digits from the rDigits array. 
   static String^ radixCode = "Ra";
   static array<Char>^rDigits = {'0','1','2','3','4','5'
,'6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P'
,'Q','R','S','T','U','V','W','X','Y','Z'};

public:

   // This method returns an object that implements ICustomFormatter
 
   // to do the formatting. 
   virtual Object^ GetFormat( Type^ argType )
   {
      
      // Here, the same object (this) is returned, but it would 
      // be possible to return an object of a different type.
      if ( argType == ICustomFormatter::typeid )
            return this;
      else
            return null;
   }


   // This method does the formatting only if it recognizes the 
   // format codes. 
   virtual String^ Format( String^ formatString, Object^ argToBeFormatted, IFormatProvider^
 provider )
   {
      
      // If no format string is provided or the format string cannot
 
      // be handled, use IFormattable or standard string processing.
      if ( formatString == null ||  !formatString->Trim()->StartsWith(
 radixCode ) )
      {
         if ( dynamic_cast<IFormattable^>(argToBeFormatted)
 != nullptr )
                  return static_cast<IFormattable^>(argToBeFormatted)->ToString(
 formatString, provider );
         else
                  return argToBeFormatted->ToString();
      }

      
      // The formatting is handled here.
      int digitIndex = 0;
      __int64 radix;
      __int64 longToBeFormatted;
      __int64 longPositive;
      array<Char>^outDigits = gcnew array<Char>(64);
      
      // Extract the radix from the format string.
      formatString = formatString->Replace( radixCode,  "" );
      try
      {
         radix = Convert::ToInt64( formatString );
      }
      catch ( Exception^ ex ) 
      {
         throw gcnew ArgumentException( String::Format( "The radix \"{0}\"
 is invalid.\n", formatString ),ex );
      }

      
      // Verify that the radix is in the proper range.
      if ( radix < 2 || radix > 36 )
            throw gcnew ArgumentException( String::Format( "The radix \"{0}\"
 is not in the range 2..36.", formatString ) );

      
      // Verify that the argument can be converted to a long integer.
      try
      {
         longToBeFormatted =  *static_cast<__int64^>(argToBeFormatted);
      }
      catch ( Exception^ ex ) 
      {
         throw gcnew ArgumentException( String::Format( "The argument \"{0}\"
 cannot be "
         "converted to an integer value.", argToBeFormatted ),ex );
      }

      
      // Extract the magnitude for conversion.
      longPositive = Math::Abs( longToBeFormatted );
      
      // Convert the magnitude to a digit string.
      for ( digitIndex = 0; longPositive != 0 && digitIndex
 <= 64; digitIndex++ )
      {
         outDigits[ outDigits->Length - digitIndex - 1 ] = rDigits[ longPositive
 % radix ];
         longPositive /= radix;

      }
      
      // Add a minus sign if the argument is negative.
      if ( longToBeFormatted < 0 )
            outDigits[ outDigits->Length - digitIndex++ - 1 ] = '-';

      return gcnew String( outDigits,outDigits->Length - digitIndex,digitIndex
 );
   }

};

void ConvertToAnyRadix( Object^ argToConvert, String^ formatStr
 )
{
   AnyRadix^ provider = gcnew AnyRadix;
   String^ messageStr = String::Format( "{{0:{0}}}", formatStr );
   
   // Write the first part of the output line.
   Console::Write( "{0,18}  {1,-6}", argToConvert, formatStr );
   
   // Convert the specified argument using the specified format.
   try
   {
      array<Object^>^argArray = {argToConvert};
      Console::WriteLine( String::Format( provider, messageStr, argArray ) );
   }
   catch ( Exception^ ex ) 
   {
      
      // Display the exception without the stack trace.
      int lineEnd = ex->ToString()->IndexOf( '\n' );
      Console::WriteLine( "{0}\n", ex->ToString()->Substring( 0,
 lineEnd ) );
   }

}

int main()
{
   __int64 twoToThe32 = 4294967296;
   __int64 fifteenNines = 999999999999999;
   Console::WriteLine( "This example of the IFormatProvider interface \n"
   "and the IFormatProvider::GetFormat( Type* ) method "
   "\ngenerates the following output.\n" );
   Console::WriteLine( "{0,18} Format Result", "Number" );
   Console::WriteLine( "{0,18} ------ ------", "------" );
   
   // These are valid conversions.
   ConvertToAnyRadix( twoToThe32, "Ra2" );
   ConvertToAnyRadix( twoToThe32, "Ra5" );
   ConvertToAnyRadix( twoToThe32, "Ra16" );
   ConvertToAnyRadix( twoToThe32, "Ra23" );
   ConvertToAnyRadix( twoToThe32, "Ra36" );
   ConvertToAnyRadix( fifteenNines, "Ra2" );
   ConvertToAnyRadix( fifteenNines, "Ra3" );
   ConvertToAnyRadix( fifteenNines, "Ra8" );
   ConvertToAnyRadix( fifteenNines, "Ra11" );
   ConvertToAnyRadix( fifteenNines, "Ra16" );
   ConvertToAnyRadix( fifteenNines, "Ra23" );
   ConvertToAnyRadix( fifteenNines, "Ra36" );
   ConvertToAnyRadix( fifteenNines, "E16" );
   ConvertToAnyRadix( fifteenNines, "" );
   
   // These are error conditions.
   ConvertToAnyRadix( fifteenNines, "Ra37" );
   ConvertToAnyRadix( "ABCDEFGHIJKLM", "Ra16" );
}

/*
This example of the IFormatProvider interface
and the IFormatProvider::GetFormat( Type* ) method
generates the following output.

            Number Format Result
            ------ ------ ------
        4294967296  Ra2   100000000000000000000000000000000
        4294967296  Ra5   32244002423141
        4294967296  Ra16  100000000
        4294967296  Ra23  1606K7IC
        4294967296  Ra36  1Z141Z4
   999999999999999  Ra2   11100011010111111010100100110001100111111111111111
   999999999999999  Ra3   11212010201001210101011021212000
   999999999999999  Ra8   34327724461477777
   999999999999999  Ra11  26A6A3689065639
   999999999999999  Ra16  38D7EA4C67FFF
   999999999999999  Ra23  1134DIFHLMM4
   999999999999999  Ra36  9UGXNORJLR
   999999999999999  E16   9.9999999999999900E+014
   999999999999999        999999999999999
   999999999999999  Ra37  System.ArgumentException: The radix "37" is not
 in th
e range 2..36.

     ABCDEFGHIJKLM  Ra16  System.ArgumentException: The argument "ABCDEFGHIJKLM
" cannot be converted to an integer value. ---> System.InvalidCastException:
 Sp
ecified cast is not valid.
*/
// Sample for the IFormatProvider interface and
// the IFormatProvider.GetFormat( Type ) method.
import System.*;

// This class implements the "Ra" formatting code. An instance
 of this
// class should be passed to methods requiring an IFormatProvider.
public class AnyRadix implements ICustomFormatter
,IFormatProvider
{
    // The value to be formatted is returned as a signed string 
    // of digits from the rDigits array. 
    private String radixCode = "Ra";
    private static char
 rDigits[] = {
        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 
        'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 
        'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 
        'U', 'V', 'W', 'X', 'Y', 'Z' };
   
    // This method returns an object that implements ICustomFormatter
 
    // to do the formatting. 
    public Object GetFormat(Type argType)
    {
        // Here, the same object (this) is returned, but it would 
        // be possible to return an object of a different type.
        if ( argType.Equals(ICustomFormatter.class.ToType())
 ) {
            return this ;
        }
        else {
            return null ;
        }
    } //GetFormat
    
    // This method does the formatting only if it recognizes the 
    // format codes. 
    public String Format(String formatString, Object argToBeFormatted
,
                        IFormatProvider provider) 
    {
        // If no format string is provided or the format string cannot
 
        // be handled, use IFormattable or standard string processing.
        if(formatString == null||!(formatString.Trim().StartsWith(radixCode)))
 {
            if ( argToBeFormatted instanceof IFormattable  ) {
                return((IFormattable)(argToBeFormatted)).
                    ToString(formatString,provider);
            }
            else {
                return argToBeFormatted.ToString();
            }
        }

        // The formatting is handled here.
        int digitIndex = 0;
        long radix;
        long longToBeFormatted;
        long longPositive;
        char outDigits[] = new char[63];
      
        // Extract the radix from the format string.
        formatString = formatString.Replace(radixCode, "");
        try {
            radix = Convert.ToInt64(formatString);
        }
        catch(System.Exception  ex) {
            throw new ArgumentException(String.Format(
                "The radix \"{0}\" is invalid.", formatString),
 ex);
        }
      
        // Verify that the radix is in the proper range.
        if ( radix < 2 || radix > 36  ) {
            throw new ArgumentException(String.Format(
                "The radix \"{0}\" is not in the
 range 2..36.", formatString));
        }
      
        // Verify that the argument can be converted to a long integer.
        try {
            longToBeFormatted =(long)System.Convert.ToUInt64(argToBeFormatted);
        }
        catch(System.Exception  ex) {
            throw new ArgumentException(String.Format(
                "The argument \"{0}\" cannot be "
                + "converted to an integer value.", argToBeFormatted),
 ex);
        }
      
        // Extract the magnitude for conversion.
        longPositive = System.Math.Abs(longToBeFormatted);

        // Convert the magnitude to a digit string.
        for(digitIndex = 0;digitIndex <= 64;digitIndex++) {
            if ( longPositive == 0  ) {
                break ;
            }        
            outDigits[outDigits.length - digitIndex - 1] = 
                rDigits[(int)(longPositive % radix)];
            longPositive /= radix;
        }      
        // Add a minus sign if the argument is negative.
        if ( longToBeFormatted < 0  ) {
            outDigits [outDigits.length - digitIndex ++ - 1] = '-';
        }      
        return new String(outDigits, outDigits.length
 - digitIndex, digitIndex);
    } //Format
} //AnyRadix

class IFormatProviderDemo
{   
    static void ConvertToAnyRadix(Object argToConvert,
 String formatStr) 
    {
        AnyRadix provider = new AnyRadix();        
        String messageStr = String.Format("{{0:{0}}}", formatStr);
        
        // Write the first part of the output line.
        Console.Write("{0,18}  {1,-6}", argToConvert, formatStr);
        
        // Convert the specified argument using the specified format.
        try {
            Console.WriteLine(String.Format((IFormatProvider)provider,
                messageStr,new Object[]{ argToConvert}));
        }
        catch(System.Exception ex) {
            // Display the exception without the stack trace.
            int lineEnd = ex.ToString().IndexOf('\n');       
     
            Console.WriteLine("{0}\n", ex.ToString().Substring(0, lineEnd));
        }
    } //ConvertToAnyRadix  
   
    public static void main(String[]
 args)
    {
        long twoToThe32 = 4294967296L;
        long fifteenNines = 999999999999999L;

        Console.WriteLine(("This example of the IFormatProvider interface \n"
            + "and the IFormatProvider.GetFormat( Type ) method "
            + "\ngenerates the following output.\n"));
        Console.WriteLine("{0,18} Format Result", "Number");
        Console.WriteLine("{0,18} ------ ------", "------");

        // These are valid conversions.
        ConvertToAnyRadix(((System.UInt64 )(twoToThe32)), "Ra2");
        ConvertToAnyRadix(((System.UInt64)(twoToThe32)), "Ra5");
        ConvertToAnyRadix(((System.UInt64)(twoToThe32)), "Ra16");
        ConvertToAnyRadix(((System.UInt64)(twoToThe32)), "Ra23");
        ConvertToAnyRadix(((System.UInt64)(twoToThe32)), "Ra36");
        ConvertToAnyRadix(((System.UInt64)(fifteenNines)), "Ra2");
        ConvertToAnyRadix(((System.UInt64)(fifteenNines)), "Ra3");
        ConvertToAnyRadix(((System.UInt64)(fifteenNines)), "Ra8");
        ConvertToAnyRadix(((System.UInt64)(fifteenNines)), "Ra11");
        ConvertToAnyRadix(((System.UInt64)(fifteenNines)), "Ra16");
        ConvertToAnyRadix(((System.UInt64)(fifteenNines)), "Ra23");
        ConvertToAnyRadix(((System.UInt64)(fifteenNines)), "Ra36");
        ConvertToAnyRadix(((System.UInt64)(fifteenNines)), "E16");
        ConvertToAnyRadix(((System.UInt64)(fifteenNines)), "");

        // These are error conditions.
        ConvertToAnyRadix(((System.UInt64)(fifteenNines)), "Ra37");
        ConvertToAnyRadix("ABCDEFGHIJKLM", "Ra16");
    } //main
} //IFormatProviderDemo

/*
This example of the IFormatProvider interface
and the IFormatProvider.GetFormat( Type ) method
generates the following output.

            Number Format Result
            ------ ------ ------
        4294967296  Ra2   100000000000000000000000000000000
        4294967296  Ra5   32244002423141
        4294967296  Ra16  100000000
        4294967296  Ra23  1606K7IC
        4294967296  Ra36  1Z141Z4
   999999999999999  Ra2   11100011010111111010100100110001100111111111111111
   999999999999999  Ra3   11212010201001210101011021212000
   999999999999999  Ra8   34327724461477777
   999999999999999  Ra11  26A6A3689065639
   999999999999999  Ra16  38D7EA4C67FFF
   999999999999999  Ra23  1134DIFHLMM4
   999999999999999  Ra36  9UGXNORJLR
   999999999999999  E16   9.9999999999999900E+014
   999999999999999        999999999999999
   999999999999999  Ra37  System.ArgumentException: The radix "37" is not
 in th
e range 2..36.

     ABCDEFGHIJKLM  Ra16  System.ArgumentException: The argument "ABCDEFGHIJKLM"
 cannot be converted to an integer value. ---> System.FormatException: Input str
ing was not in a correct format.
*/
プラットフォームプラットフォーム
バージョン情報バージョン情報
参照参照
関連項目
IFormatProvider メンバ
System 名前空間
ICustomFormatter インターフェイス
IFormattable



英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  
  •  IFormatProvider インターフェイスのページへのリンク

辞書ショートカット

すべての辞書の索引

「IFormatProvider インターフェイス」の関連用語

1
IFormatProvider メソッド .NET Framework クラス ライブラリ リファレンス
100% |||||

2
IFormatProvider メンバ .NET Framework クラス ライブラリ リファレンス
100% |||||

3
IFormattable メソッド .NET Framework クラス ライブラリ リファレンス
92% |||||

4
IFormattable メンバ .NET Framework クラス ライブラリ リファレンス
76% |||||

5
ICustomFormatter インターフェイス .NET Framework クラス ライブラリ リファレンス
74% |||||

6
MaskedTextBox.FormatProvider プロパティ .NET Framework クラス ライブラリ リファレンス
72% |||||

7
ICustomFormatter メソッド .NET Framework クラス ライブラリ リファレンス
72% |||||

8
IConvertible.ToBoolean メソッド .NET Framework クラス ライブラリ リファレンス
70% |||||

9
IConvertible.ToByte メソッド .NET Framework クラス ライブラリ リファレンス
70% |||||

10
IConvertible.ToChar メソッド .NET Framework クラス ライブラリ リファレンス
70% |||||

検索ランキング

   

英語⇒日本語
日本語⇒英語
   



IFormatProvider インターフェイスのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
日本マイクロソフト株式会社日本マイクロソフト株式会社
© 2025 Microsoft.All rights reserved.

©2025 GRAS Group, Inc.RSS