For proper encapsulation, you want the interface logic to be completely separate from your atomic behaviours like withdrawing funds.
Something to consider: Where are the funds going? In a traditional banking system all operations are done in pairs as an atom. You withdraw from one account and deposit to another account, or into the cash withdrawal ledger, et al.
Your Withdraw method should return a result containing enough information that the caller can determine how to act. This would include whether the operation was successful (and if not, why not). For a simple case, you could probably do this with an enum. The method should take a decimal in (always use decimal for money, since you're concerned with precision and double is an approximate). Your calling routine should handle the validation and conversion, and if necessary the prompt back to the user to enter a valid number.
public enum OpResult = { Complete, Failed_Insufficient_Funds, Failed_Account_Frozen, Failed_Invalid_Amount };
...
public OpResult Withdraw(decimal amount)
{
if (amount <= 0)
{
return OpResult.Failed_Invalid_Amount;
}
else if (balance - amount < odLimit)
{
return OpResult.Failed_Insufficient_Funds;
}
...
else
{
balance -= amount;
return OpResult.Complete;
}
}