PDA

View Full Version : سوال: استخراج عدد از رشته



dadsara
شنبه 16 آذر 1387, 10:53 صبح
سلام خدمت همه دوستان
سوال 1- در يك جدول من يك فيلد دارم كه تركيب اعداد و رشته مي باشد مي خواهم فقط اعداد درون اين فيلد برگردانده شود
سوال 2- در يك فيلد كه از نوع رشته مي باشد مي خواهم هنگامي كه به عدد رسيد آن عدد را داخل ( ) قرار دهد
** تصوير سوالم را پيوست مي كنم **

dadsara
دوشنبه 18 آذر 1387, 08:29 صبح
سلام
اگر كسي به راه حلي رسيده است لطفا راهنمائي كند

مهدی قربانی
دوشنبه 18 آذر 1387, 08:49 صبح
سلام
قسمت اول سئوال شما رو من قبلاً اجرا کردم و مشکلی نیست منتها در مورد بخش دوم سئوال شما پروسه یمقدار پیچیده میشه چون بحث تشخیص و ترکیب مطرحه که خوب این امر بسادگی قابل اجرا نیست ، تا این لحظه موفق نشدم روش مناسبی براش پیدا کنم .
سئوال : همیشه بین کاراکترهای حرفی و اعداد Space وجود داره یا خیر ؟

dadsara
دوشنبه 18 آذر 1387, 09:07 صبح
سلام
ضمن تشكر از جنابعالي ، باتوجه به اينكه ورود اطلاعات توسط چند كاربر صورت گرفته است و آنها از يك روش متحد استفاده نكرده اند بايد در جواب بگويم خير هميشه بين اعداد و حروف كاركتر خاصي وجود ندارد

شاپرک
دوشنبه 18 آذر 1387, 10:27 صبح
جواب سوال اول :



Function Extract_Number_from_Text(Phrase As String) As Double
Dim Length_of_String As Integer
Dim Current_Pos As Integer
Dim Temp As String
Length_of_String = Len(Phrase)
Temp = ""
For Current_Pos = 1 To Length_of_String
If (Mid(Phrase, Current_Pos, 1) = "-") Then
Temp = Temp & Mid(Phrase, Current_Pos, 1)
End If
If (Mid(Phrase, Current_Pos, 1) = ".") Then
Temp = Temp & Mid(Phrase, Current_Pos, 1)
End If
If (IsNumeric(Mid(Phrase, Current_Pos, 1))) = True Then
Temp = Temp & Mid(Phrase, Current_Pos, 1)
End If
Next Current_Pos
If Len(Temp) = 0 Then
Extract_Number_from_Text = 0
Else
Extract_Number_from_Text = CDbl(Temp)
End If
End Function


جواب سوال دوم :


Function Add_P2_Number(Phrase As String) As String

Dim Length_of_String As Integer
Dim Current_Pos As Integer
Dim Temp As String
Length_of_String = Len(Phrase)
Temp = ""

For Current_Pos = 1 To Length_of_String
If (Mid(Phrase, Current_Pos, 1) = "-") Then
Temp = Temp & Mid(Phrase, Current_Pos, 1)
End If
If (Mid(Phrase, Current_Pos, 1) = ".") Then
Temp = Temp & Mid(Phrase, Current_Pos, 1)
End If
If (IsNumeric(Mid(Phrase, Current_Pos, 1))) = True Then
Temp = Temp & Mid(Phrase, Current_Pos, 1)
End If
Next Current_Pos




Add_P2_Number = Replace(Phrase, Temp, "(" & Temp & ")")


End Function

شاپرک
دوشنبه 18 آذر 1387, 10:58 صبح
ولی وقتی 2 تا عدد توی یک رشته باشه تکلیف چیه ؟

dadsara
چهارشنبه 20 آذر 1387, 09:21 صبح
سلام
ضمن تشكر از جنابعالي
من نمونه بانك خود را در فايل ضميمه قراردادم و همچنين كدهاي جنابعالي را در يك فرم تعبيه نمودم
- قسمت اول كار مي كند امام مشكل همان است كه جنابعالي فرموديد ( ركوردهائي كه بيش از يك عدد در آنها مي باشد را بهم پيوسته نشان مي دهد و همچنين چنانچه عددي با صفر شروع شده باشد صفر را نشان نمي دهد )
پيشنهاد با قراردادن يك تكس باكس يا درون كد كاربر مي تواند مشخص كند اعداد چند رقمي را مي خواهد و يا اينكه در صورت عدم امكان بزرگترين عدد را برگرداند
- قسمت دوم من كد جنابعالي را در فرم زير كليد كپي كردم ولي ظاهرا يك جاي كار مشكل دارد و يا اينكه من درست انجام نداده ام

شاپرک
چهارشنبه 20 آذر 1387, 15:38 عصر
خط اول تابع دوم جا افتاده بود که ویرایش شد :


Function Add_P2_Number(Phrase As String) As String

اما در مورد رکورد هایی که بیش از دو عدد دارن :
فکر میکنم شما از این تابع برای اصلاح جداولتون میخواهید استفاده کنید که به نظر من کار درستی نیست . یعنی روش خیلی مطمئنی نیست .
چون اطلاعاتتون هم به نظر میاید مربوط به اطلاعات حسابداری باشه که خیلی حساس است .

dadsara
شنبه 23 آذر 1387, 08:55 صبح
سلام
كد قسمت دوم را در يك ماژول كپي كردم و در فرم مربوطه استفاده نمودم ولي متاسفانه هنگاميكه متن شرح به يك عدد و يا - ختم شود كد درست كار نمي كند و يا اينكه در متن دو عدد داشته باشيم اين عمليات در مورد هيچكدام از آنها اعمال نمي شود

شاپرک
شنبه 23 آذر 1387, 13:46 عصر
پست قبلی رو خوندید؟

dadsara
یک شنبه 24 آذر 1387, 08:54 صبح
سلام
بله خونده بودم ولي راهكار چيه ؟

شاپرک
دوشنبه 25 آذر 1387, 11:00 صبح
کار نشد نداره . با تغییر این کد میتونید به مواردی که میخواهید هم برسید هر چند که نتیجه 100% نیست .
منتها شرمنده من وقت ندارم ... لطفا دوستان دیگه کد ها رو تکمیل کنند .

laia56
دوشنبه 16 مرداد 1391, 13:22 عصر
سلام
كد قسمت دوم را در يك ماژول كپي كردم و در فرم مربوطه استفاده نمودم ولي متاسفانه هنگاميكه متن شرح به يك عدد و يا - ختم شود كد درست كار نمي كند و يا اينكه در متن دو عدد داشته باشيم اين عمليات در مورد هيچكدام از آنها اعمال نمي شود

با سلام خدمت اساتید
درست است که از زمان ایجاد این تایپیک زمان نسبتا زیادی گذشته اما اینمورد مشکل امروز بنده میباشد که وقتی شرح به - میرسد یا بین دوعدد - کد ارور میدهد که اگر در حالت کوئری باشیم که ارور دست بردار نیست
لطفا دوستان و اساتید عنایت نموده و راهنمایی نمایند

Abbas Amiri
دوشنبه 16 مرداد 1391, 22:08 عصر
از تابع زیر کمک بگیرید. لازم بذکر است چنانچه در رشته ارسالی به تابع بیش از یک بخش عددی باشد(مثل "hjh554ljj-l3601ih") فقط اولین بش را برمیگرداند یعنی 554 را .درصورت درخواست تمامی اعداد مقداری تغییر لازم است


Function NumberInText(strNumAndText As String) As Long
Dim k As Integer, N As String
If Len(NumberInText) = 0 Then Exit Function
For k = 1 To Len(strNumAndText)
If IsNumeric(Mid(strNumAndText, k, 1)) Then
N = N & Mid(strNumAndText, k, 1)
Else
If Len(N) Then Exit For
End If
Next
If N = "" Then N = "0"
NumberInText = CLng(N)
End Function

laia56
دوشنبه 16 مرداد 1391, 23:47 عصر
با تشکر مخصوص از شما و سایر اساتید
بسیار مفید بود
خواهش دیگری که دارم کدی برای جدا سازی بخش رشته است یعنی صرفا بخش رشته اینبار تفکیک شود

Abbas Amiri
دوشنبه 16 مرداد 1391, 23:56 عصر
ابتدا عرض کنم خط سوم از تابع قبلی بصورت زیر تصحیح شود:


If Len(strNumAndText) = 0 Then Exit Function

و جهت رشته غیر عددی با اندکی تغییر درکدفوق قابل اجراست


Function SelectText(strNumAndText As String) As String
Dim k As Integer, N As String
If Len(strNumAndText) = 0 Then Exit Function
For k = 1 To Len(strNumAndText)
If Not IsNumeric(Mid(strNumAndText, k, 1)) Then
N = N & Mid(strNumAndText, k, 1)
Else
If Len(N) Then Exit For
End If
Next
SelectText = N
End Function

laia56
سه شنبه 17 مرداد 1391, 09:52 صبح
از تابع زیر کمک بگیرید. لازم بذکر است چنانچه در رشته ارسالی به تابع بیش از یک بخش عددی باشد(مثل "hjh554ljj-l3601ih") فقط اولین بش را برمیگرداند یعنی 554 را .درصورت درخواست تمامی اعداد مقداری تغییر لازم است


Function NumberInText(strNumAndText As String) As Long
Dim k As Integer, N As String
If Len(NumberInText) = 0 Then Exit Function
For k = 1 To Len(strNumAndText)
If IsNumeric(Mid(strNumAndText, k, 1)) Then
N = N & Mid(strNumAndText, k, 1)
Else
If Len(N) Then Exit For
End If
Next
If N = "" Then N = "0"
NumberInText = CLng(N)
End Function


با عرض سلام و تشکر از شما
اگر قبول زحمت نمایید این تایپیک را کامل نمایید
کدی که تمامی اعداد را بخواهیم بصورتیکه بوسیله همان - یا آیتمی شبیه آن از یکدیگر جدا شوند را نمایش بدهد
مجددا از محبت و عنایت شما کمال تشکر را دارم

emami.sie
سه شنبه 17 مرداد 1391, 11:54 صبح
با سلام
و با اجازه از جناب امیری عزیز
در جواب پست آخر می تونید از تابع زیر استفاده کنید:
Function NumberInText(strNumAndText As String) As String
Dim k As Integer, N As String
If Len(strNumAndText) = 0 Then Exit Function
N = ""
For k = 1 To Len(strNumAndText)
If (Mid(strNumAndText, k, 1) = "-") Then
N = N & Mid(strNumAndText, k, 1)
End If
If (Mid(strNumAndText, k, 1) = ".") Then
N = N & Mid(strNumAndText, k, 1)
End If
If IsNumeric(Mid(strNumAndText, k, 1)) = True Then
N = N & Mid(strNumAndText, k, 1)
End If
Next k
NumberInText = N
End Function
موفق باشید
یا علی

Abbas Amiri
سه شنبه 17 مرداد 1391, 18:46 عصر
ضمن تشکر از جناب امامی
فقط جهت یادآوری وآموزش جهت کاربران عرض میکنم : خط چهارم کد فوق اضافیست . چون زمانی که متغیری را از نوع رشته ، عدد یا بولین تعریف می کنید مقدار اولیه آنها به ترتیب vbNullString ( رشته خالی "" ) ، 0 و False میباشد ضمن اینکه هیچ خطایی نیست ومشکلی هم پیش نمی آیدو خود من هم بعضی مواقع سهوا انجام میدهم .
ودر مورد دو پست قبلی، چنانچه عبارت If Len(N) Then Exit For حذف شود تمام عدد ویا تکست برگردانده میشود.

Abbas Amiri
سه شنبه 17 مرداد 1391, 23:30 عصر
ازتوضیحاتتان متشکرم .


Dim Statement
.....
....
When variables are initialized, a numeric variable is initialized to 0, a variable-length string is initialized to a zero-length string (""), and a fixed-length string is filled with zeros. Variant variables are initialized to Empty. Each element of a user-defined type variable is initialized as if it were a separate variable