C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

全過去ログを検索

<< 0 >>
■38041  Re[1]: Environment.UserDomainNameについて
□投稿者/ 魔界の仮面弁士 -(2009/07/06(Mon) 14:45:59)
    No38038 (たろ さん) に返信
    > 初歩的な質問です。
    本当に?


    > .NET Framework1.1の環境で作成したwindowサービスを
    > .NET Framework2.0の環境で起動しても、
    > 「マイコンピュータのプロパティで参照できるドメイン名」を取得させることはできないのでしょうか?
    手元に同様の環境が無いので検証はできませんが、どちらのバージョンも、基本的には内部で
    LookupAccountName API を呼び出すのですが、2.0 版はその前に、GetUserNameEx API を
    優先的に利用する仕様になっているようです。

    # おそらく .NET 2.0 では、Win98 や NT 4.0 をサポートしなくなったため、
    # GetUserNameEx の呼び出し機能が追加されたのではないかな…と想像。


    で、手元の環境でこれらの API を、LocalSystem アカウントのサービスで実行したところ、
     GetUserNameEx は「ワークグループ名\アカウント名」
     LookupAccountName は「NT AUTHORITY」
    を返してきました。テスト環境は .NET 3.5 SP1 + Windows XP SP3 です。


    protected override void OnStart(string[] args)
    {
     EventLogTraceListener listener = new EventLogTraceListener("Service1");
     Trace.Listeners.Add(listener);

     int capacity;
     StringBuilder domainName;

     capacity = 1024;
     domainName = new StringBuilder(capacity);
     if (!GetUserNameEx(2, domainName, ref capacity))
     {
      Trace.WriteLine("GetUserNameEx 失敗:0x" + Marshal.GetLastWin32Error().ToString("x8"));
     }
     else
     {
      Trace.WriteLine("GetUserNameEx 成功:" + domainName.ToString());
     }

     int length = 1024;
     byte[] sid = new byte[length];
     int sid_name_use;
     capacity = 1024;
     domainName = new StringBuilder(capacity);
     if (!LookupAccountName(null, Environment.UserName, sid, ref length, domainName, ref capacity, out sid_name_use))
     {
      Trace.WriteLine("LookupAccountName 失敗:0x" + Marshal.GetLastWin32Error().ToString("x8"));
     }
     else
     {
      Trace.WriteLine("LookupAccountName 成功:" + domainName.ToString());
     }

     listener.Close();
     Trace.Listeners.Remove(listener);
     listener.Dispose();
    }

    [DllImport("advapi32", CharSet = CharSet.Unicode, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.U1)]
    private static extern bool LookupAccountName(
     string machineName,
     string accountName,
     byte[] sid,
     ref int sidLen,
     StringBuilder domainName,
     ref int domainNameLen,
     out int peUse
    );

    [DllImport("secur32", CharSet = CharSet.Unicode, SetLastError = true)]
    private static extern bool GetUserNameEx(
     int format,
     StringBuilder domainName,
     ref int domainNameLen
    );
記事No.38038 のレス /過去ログ65より / 関連記事表示
削除チェック/

■43797  Re[5]: ListView1_MouseWheelでのVistaとXP
□投稿者/ とし -(2009/11/19(Thu) 09:45:39)
    No43795 (オショウ さん) に返信
    オショウ様、ご回答どうもありがとうございます。
    こちらでテストした 4台PCとも IBM(Lenovo)純正オプティカルマウス
    で、ドライバもWindows標準になっております。
    グラフィック関連のドライバとか関係するのでしょうか?
記事No.43710 のレス /過去ログ75より / 関連記事表示
削除チェック/

■74421  Re[7]: 正規表現
□投稿者/ 魔界の仮面弁士 -(2014/12/25(Thu) 14:38:35)
    No74418 (くま さん) に返信
    > 大変失礼いたしました。申し訳ありません。
    > asp.net の c#です。

    だとすると、

    > >>@"(?<=class=""test""\>\<img.*src="").*(?="" />)")
    これは、
      @"(?<=class=""test""\>\<img.*src="").*(?="" />)"
    なのではありませんか? \も余計な気がしますが。

    // var url = Regex.Match(s, @"(?<=class=""test""\>\<img.*src="").*(?="" />)");



    >>>ここまで出来ています。

    このままだとマッチしないと思いますよ。

    提示頂いた正規表現の場合、
     「class="test"><img〜〜〜src="」と「" />」に囲まれた『0文字以上の文字列』
    という意味になるかと思います。

    しかし今回の場合、「<img」の前にあるのは
    「class="test">」ではなく「class="test">{改行}」ですよね。


    改行だけでなく、タブや空白などを含む可能性も考慮すると、
     var url = Regex.Match(s, @"(?<=class=""test""\s*>\s*<img.*src="").*(?="" />)");
    あたりで如何でしょうか。
    元データの表記揺れ次第では、これでもまだ十分では無いですが。
記事No.74409 のレス /過去ログ125より / 関連記事表示
削除チェック/

■85915  Re[3]: 指数表記された文字列の数値変換方法について
□投稿者/ 魔界の仮面弁士 -(2017/12/01(Fri) 11:13:23)
    # 解決済みマークはつけたままにしておきます。

    No85904 (たかじ さん) に返信
    >>> 指数表記されている文字列(2.12345678975E9や3.4E+38など)を
    >>> decimalにTryParseすると、変換に失敗します。
    >> 後者はどうやっても不可能です。最大値(decimal.MaxValue)を大幅に超えていますから…。
    > 3.4E+38の変換については、型の問題もありますので、解決方法検討してみます。


    値が大きいので、基本的には System.Single や System.Double の
    出番な気がしますが、最終的には要件が求める許容誤差次第ですね。


    あとは System.Numerics.BigInteger を使う手もありますが、
    あくまで整数なので、"3.4E+38" はパースできても、
    "2.12345678975E9" の方には使えません。


    using System;
    using System.Globalization;
    using System.Numerics; // 参照設定: System.Numerics.dll
    class Program
    {
     static void Main()
     {
      var ns = NumberStyles.Float;
      var fmt = CultureInfo.InvariantCulture;

      string s1 = "2.12345678975E9";
      decimal dm; double d1; float f1;
      decimal.TryParse(s1, ns, fmt, out dm); // true
      double.TryParse(s1, ns, fmt, out d1);  // true
      float.TryParse(s1, ns, fmt, out f1);  // true
      Console.WriteLine("{0:N4}", dm); // 2,123,456,789.7500
      Console.WriteLine("{0:N4}", d1); // 2,123,456,789.7500
      Console.WriteLine("{0:N4}", f1); // 2,123,457,000.0000

      string s2 = "3.4E+38";
      BigInteger b1, b2, b3; double d2; float f2;
      BigInteger.TryParse(s2, ns, fmt, out b1); // true
      double.TryParse(s2, ns, fmt, out d2);   // true
      float.TryParse(s2, ns, fmt, out f2);    // true
      b2 = (BigInteger)d2;
      b3 = (BigInteger)f2;
      Console.WriteLine("{0:N4}", b1); // 340,000,000,000,000,000,000,000,000,000,000,000,000.0000
      Console.WriteLine("{0:N4}", d2); // 340,000,000,000,000,000,000,000,000,000,000,000,000.0000
      Console.WriteLine("{0:N4}", b2); // 339,999,999,999,999,996,123,846,586,046,231,871,488.0000
      Console.WriteLine("{0:N4}", b3); // 339,999,995,214,436,424,907,732,413,799,364,296,704.0000

      Console.ReadKey();
     }
    }


    あとは、nuget などからの導入になりますが、BigDecimal とかですかね。


    Deveel.Math.BigDecimal v1, v2, v3;
    Deveel.Math.BigDecimal.TryParse("2.12345678975E9", out v1);
    Deveel.Math.BigDecimal.TryParse("3.4E+38", out v2);
    Deveel.Math.BigDecimal.TryParse("340000000000000000000000000000000000000", out v3);

    上記はいずれも true を返しますが、値の大小比較をする際には注意が必要です。
    v2 と v3 は、数値的には同じ値ですが、有効桁数が異なりますので。

    Console.WriteLine(v2.CompareTo(v3)); // 0 (一致)
    Console.WriteLine(v2 == v3);  // False (不一致)
    Console.WriteLine("{0}", v1); // 2123456789.75
    Console.WriteLine("{0}", v2); // 3.4E+38
    Console.WriteLine("{0}", v3); // 340000000000000000000000000000000000000

    ※ v2 は 指数 -37、有効桁数 2 桁 ( 34 × 10 ^ -37)
    ※ v3 は 指数 0、有効桁数 39 桁 (340000000000000000000000000000000000000 × 10 ^ 0)
記事No.85832 のレス / END /過去ログ147より / 関連記事表示
削除チェック/

■85967  Re[4]: 指数表記された文字列の数値変換方法について
□投稿者/ たかじ -(2017/12/06(Wed) 10:14:15)
    No85915 (魔界の仮面弁士 さん) に返信

    解決方法のご提案までありがとうございます。

    Deveel.Math.BigDecimalを初めて知ったので、
    サンプルを作成しながら利用可能か試しているのですが、気になる点があります。
    もしご存知でしたら教えていただけないでしょうか。

    ・BigDecimalの演算はAdd、Subtract、Multiply、Divideのメソッドを使用しないとだめなのでしょうか?
     下記の結果だと、Subtractを使用すると指数表記無しで、*だと指数表記なのも気になります。
    ・指数表記の値をToXXで変換するとエラーが発生するのですが、回避策などありますでしょか?

    Deveel.Math.BigDecimal b1 = 300;
    Deveel.Math.BigDecimal b2 = 10000000;
    Deveel.Math.BigDecimal b3 = b1 * b2;
    Deveel.Math.BigDecimal b4 = b1.Multiply(b2);
    Console.WriteLine("{0}", b1); // 300
    Console.WriteLine("{0}", b2); // 10000000
    Console.WriteLine("{0}", b3); // 3.00E+9
    Console.WriteLine("{0}", (UInt32)b3); // 3000000000
    Console.WriteLine("{0}", b4.ToDecimal()); // 3000000000
    Console.WriteLine("{0}", (decimal)b3); // 3000000000
    Console.WriteLine("{0}", b3.ToDecimal()); // 例外が発生(Negative exponent)

    以上、よろしくお願いいたします。
記事No.85832 のレス /過去ログ147より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -