2010-04-16 19 views
11

मैंने हाल ही में इस धारणा के तहत किया था कि वीबीएनईटी में CDbl(x) ऑपरेशन अनिवार्य रूप से एक कलाकार था (यानी, वीबी समकक्ष (double)x सी # में; लेकिन हाल ही की एक खोज से पता चला है कि यह मामला नहीं है।सीडीबीएल क्या कर रहा है?

अगर मैं इस स्ट्रिंग है:

Dim s As String = "12345.12345-" 

और मैं ऐसा करते हैं:

Dim d As Double = CDbl(s) 

d मूल्य -12345.12345 करने के लिए सेट कर दिया जाएगा! अब, मुझे गलत मत समझो, यह मेरे विशेष परिदृश्य में सुविधाजनक है; लेकिन मुझे यह मानना ​​है कि मैं के रूप में उलझन में हूं क्यों यह काम करता है। विशेष रूप से, मैं उलझन में हूं क्योंकि:

  • Double.Parse उपर्युक्त इनपुट के साथ काम नहीं करता है।
  • Double.TryParse काम नहीं करता है।
  • Convert.ToDouble काम नहीं करता है।

CDbl कितना चालाक है?

उत्तर

14

यह Microsoft.VisualBasic.CompilerServices.Conversions.ToDouble का उपयोग करता है()। उस फ़ंक्शन में ऑब्जेक्ट के GetTypeCode() वापसी मान पर एक चयन कथन शामिल है, इसलिए यह तर्क के प्रकार के आधार पर एक कस्टम कनवर्टर का उपयोग कर सकता है। स्ट्रिंग कनवर्टर इस संभावना को मानता है कि स्ट्रिंग में मुद्रा मान हो सकता है और उस से निपटने के लिए स्ट्रिंग पर कुछ प्रोसेसिंग करता है। मुद्रा मूल्यों के लिए एक अनुमत प्रारूप एक पिछला नकारात्मक संकेत है।

यह विशेष रूप से सस्ता नहीं है। एक ही रूपांतरण प्राप्त करने का सबसे तेज़ तरीका है:

Dim s As String = "12345.12345-" 
Dim d As Double = Double.Parse(s, Globalization.NumberStyles.Any) 
+1

गहराई से उत्तर के लिए धन्यवाद। एक वीबी 6 प्रोग्रामर जो .NET में परिवर्तित हो गया है, मैंने हमेशा पुराने वीबी फ़ंक्शन तरीके का उपयोग करने के बजाय ".NET तरीका" करने की कोशिश की है। उदाहरण के लिए: बाएं, मध्य, दाएं, बजाय Lsase आदि के बजाय .substring। – Jeremy

0

यदि आप नियंत्रण कक्ष में क्षेत्रीय विकल्प में जाते हैं, तो एक सेटिंग है जो आपको पहले की बजाय, संख्याओं के बाद शून्य चिह्न डाल देती है।

मुझे यकीन नहीं है कि कौन सी प्रणाली संख्याओं के बाद एक ऋण चिह्न का उपयोग करती है, लेकिन ऐसा लगता है कि सीडीबीएल दोनों को स्वीकार करने के लिए प्रोग्राम किया गया है। आप जो स्वीकार करते हैं उसमें उदार रहें, और वह सब कुछ।

क्षेत्रीय विकल्पों में नकारात्मक संख्याओं की एक सेटिंग भी है जहां वे ब्रैकेट में हैं। क्या वह काम करता है? - CDbl("(12345.12345)")

1

कि हमेशा दृश्य मूल 4/5/6 में CDbl() के व्यवहार किया गया है और (यह इनलाइन, ढांचे का हिस्सा नहीं) तो यह शायद सिर्फ लोगों बढ़ने के लिए रखा गया है वर्तमान में VB.NET लिए विशिष्ट है, है पिछले संस्करणों से।

(सुविधाओं QBasic से अधिक खरीदा की वजह से बहुत pre-.NET विजुअल बेसिक में अलौकिकता की तरह।)

संबंधित मुद्दे